Além de um refactoring no modelo de criação dos componentes as informações são declaradas por meio de anotações (annotations). Estas anotações são acessadas por reflexion e desta forma o container EJB sabe como gerenciar o cliclo de vida do componente. Anteriormente muitas destas informações eram colocadas em arquivos XML. Não que se tenha extinguido o uso totalmente, mas se não fugir muito do trivial não será necessário declarar quase nada em xml. Segue um exemplo de Stateless.
Inicialmente definimos a interface que irá descrever os métodos que o componente terá.
public interface MyService {
public static final String NAME = "damnit";
public void helloWorld();
}
Depois podemos criar nossa interface remote (assim como com EJB 2.x) Mas note que agora a anotação @Remote é que marca a interface.
@Remote
public interface MyServiceRemote extends MyService { }
A interface Local continua com a mesma funcionalidade, chamadas entre componentes localmente. A anotação aqui é @Local
@Local
public interface MyServiceLocal extends MyService { }
Por fim a implementação do serviço propriamente dito.
@Clustered //opcional, somenente em caso de uso de cluster
@Stateless(name=MyService.NAME) //tipo de EJB
@Remote(MyServiceRemote.class) //qual a interfaces remota?
@Local(MyServiceLocal.class) //qual a interfaces local?
public class MyServiceImpl implements MyServiceRemote, MyServiceLocal {
public void helloWorld() {
System.out.println("Damnit!");
}
}
Eu acabei colocando os extends e implements pra garantir que a assinatura na interface de serviço e a implementação estão de acordo.
Posteriormente deve-se criar o application.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
"http://java.sun.com/dtd/application_1_3.dtd">
<application>
<display-name>MyServiceApplication</display-name>
<module>
<ejb>MyEJBs.jar</ejb>
</module>
<module>
<java>lib/jdbc.jar</java>
</module>
<module>
<java>lib/brokers.jar</java>
</module>
<module>
<java>lib/util.jar</java>
</module>
</application>
Simulei o uso de alguns jars que seriam as dependências do componente. Por fim a estrutura do arquivo ear deve ser:
[list]
MyServiceApplication.ear
+META-INF/application.xml
+lib/util.jar
+lib/jdbc.jar
+lib/brokers.jar
-MyEJBs.jar
[/list]
O nome do arquivo ear e display-name devem ser iguais! Lembrando que a criação do ear pode ser feita com tasks do ant.
Depois é encontrar um application server (JBoss por exemplo) e fazer o deploy.
O cliente deve receber as interfaces de serviço e remote somente. Neste caso o uso de um ServiceLocator também ajuda.
public class MyServiceClient {
private MyService service;
/* não mandatório mas para IOC é necessário */
@EJB(name = MyServiceService.NAME)
public void setRemote(MyService service) {
this.service = service;
}
public MyServiceClient() {
InitialContext ctx = new InitialContext(getProperties());
final Object serv = ctx.lookup("MyServiceApplication/" + MyService.NAME + "/Remote");
setRemote((MyService) serv);
}
public void helloWorld() {
service.helloWorld();
}
}
E por aí vai… T+