2. O que é EJB?
Plataforma para construir aplicações corporativas
que são portáveis, reutilizáveis e escaláveis
Pode ser visto como “modelo de componentes” ou
“framework”
O programador não precisa reinventar ser viços
como transação, segurança, persitência automática
e outras.
Programador “ganha” ser viços de
infraestrutura.
3. Para o programador...
EJB é código Java executado em um
ambiente de execução especializado,
denominado de
EJB Contêiner
Este contêiner oferece serviços de
infraestrutura aos componentes
Serviço de persistência é oferecido pelo
persistence provider
4. Questões
EJB é uma biblioteca de classes?
EJB é o nome de uma API?
EJB oferece serviços de persistência?
Código que faz uso ou se beneficia de
EJB é executado como uma classe
convencional pela máquina virtual
Java?
9. Componente?
Nada extraordinário! Apenas um POJO
(plain old java object) + poderes especiais
Ou seja, um objeto Java “ordinário”,
“comum”, ... ACRESCIDO de poderes
Encapsula comportamento da aplicação,
clientes precisam conhecer apenas como
requisitar e o que esperar na saída
11. Uso dos tipos
Session beans e
message-driven beans
(lógica de negócio)
Entity beans
(persistência)
12. Reutilização
Quem pode comprar o quê?
(pode ser reutilizado
tanto pelo sistema de
venda ao cliente quanto
pelo sistema de despacho
de mercadoria)
13. Framework EJB
Componentes ou EJBs
vivem ou são executados
em um contêiner
EJB contêiner e EBjs (ou componentes)
podem ser vistos como um framework
EJB contêiner oferece serviços úteis a
aplicações corporativas
14. Pode ser útil...
Armazenar e recuperar
informação de base relacional
Gerenciar transações
Implementar segurança
Processamento assíncrono
Integrar sistemas, ...
15. Mensagem
• Contêiner EJB oferece serviços aos
componentes ou EJBs
• EBJs ou componentes não precisam
implementá-los
16. Segurança
Em vez de implementar serviços
de segurança, você pode criar
um componente (ou EJB) e
executá-lo em um contêiner
(onde a segurança será
fornecida e configurada de
forma declarativa)
17. Resumo
Contêiner EJB oferece serviços que não
precisam ser implementados pelos EJBs
Transação, segurança,
persistência, acesso remoto,
interceptadores, timers, gerência
de estado e troca de mensagens
18. Conclusão Transação, segurança,
persistência, acesso remoto,
interceptadores, timers,
gerência de estado e troca
de mensagens
Se a sua aplicação precisa de um ou
mais destes serviços, considere o emprego
de EJBs.
19. Como criar um EJB?
POJO + Anotações (Java 5) = EJB
Objeto
Objeto
com
comum
poderes
20. O que são anotações?
Elementos que “marcam” código (classe,
método ou atributo) com um atributo
Forma declarativa de programar
Exemplo (Junit 4.0)
@Test
public void casoTrivial() {
...
}
21. Voltando a EJBs...
Anotações permitem adicionar serviços
declarativamente
Anotações são usadas para outras finalidade.
Por exemplo, descrever o tipo de EJB
Session beans (@Stateless, @Stateful)
Message-driven beans (@MessageDriven)
Entity bean (@Entity)
22. Outro fator importante
Disponibilidade e escalabilidade são
atributos que todo “conceituado”
contêiner EJB oferece
Se necessário sua aplicação pode ser
executada em um cluster. Tudo o que
precisa ser feito é um pouco de
configuração.
23. Mais um fator relevante
Acerca de Service-oriented architecture
(SOA) e interoperabilidade
Seus componentes EJB podem ser
empregados para que sua aplicação
ofereça serviços via web services!
27. O que isto significa?
Muitos estão trabalhando para manter seus
produtos competitivos e, consequentemente,
EJB.
Adicionalmente, você não está “preso” a um
fornecedor.
30. Onde EJB é útil?
Presentation layer (definitivamente não)
Business logic layer (SIM)
Segurança, interceptadores, transações, ...
Persistence layer (SIM)
Integração, persistência, cache
31. Tipo de EJB por camada
Presentation layer (não contemplada)
Business logic layer
Session beans
Message-driven beans
Persistence layer
Entity beans
32. Críticas (às camadas clássicas)
Enfatiza a modelagem dos processos do negócio
Não adequadamente modela o domínio como objetos
Lógica de negócio assemelha-se à aplicação procedural
Componentes da persistência apenas retêm dados
Domain-driven design é uma alternativa!
34. O que é DDD?
Domínio deve ser modelado como objetos
Objetos devem conter lógica de negócio
Objetos não devem ser espelhos “burros” de registros
Objetos do domínio são entities em EJB 3
Exemplo: Requisito (entity) possui método
verificaConsistencia(), por exemplo.
35. Comentário
Patterns of Enterprise Application Architecture
Martin Fowler, Addison-Wesley, 2002
Lógica de negócio “complexa” em objetos do domínio é comumente
transferida para a “camada de serviço” ou “camada de aplicação”
Tal camada é similar à camada de lógica de negócio, mas bem mais “fina”
Session beans são usados para construir a camada de aplicação
36. Camada de aplicação - DDD
“Serviços relevantes para o negócio ou interação com outras
camadas de aplicação (outros sistemas).
É mantida fina, não contém regras de negócio ou
conhecimento, mas apenas coordena tarefas e delega trabalho
para a colaboração de objetos do domínio na camada
imediatamente abaixo. Não contém estado refletindo a situação
do negócio, mas pode ter estado para refletir o progresso de
uma tarefa para o usuário ou programa”.
39. Tipos de EJBs
Session beans
Message-driven beans
Entity beans
OBSERVAÇÃO:
Cada tipo usa um subconjunto dos serviços EJB
40. Conforme o uso
Lógica de negócio
Session beans
Message-driven beans (MDBs)
Persistência
Entity beans
41. Onde são executados?
Session beans and Message-driven beans (MDBs) vivem no
contêiner
Um contêiner gerencia e oferece serviços a session beans e MDBs
Entity beans são gerenciados pelo
persistence provider
Persistence provider é parte substituível de um contêiner
Esta parte é abstraída pela Java Persistence API (JPA)
42. Resumo
Uma implementção de EJB inclui duas partes:
EJB contêiner
Cuida de session beans e MDBs
Persistence provider
Cuida de entity beans (ou entities)
43. Session beans
Um session bean é chamado por um cliente para
executar uma operação de um negócio.
Exemplos:
recuperar itens de um “carrinho de compra”
efetuar alterações em um requisito
44. Há 2 tipos de session beans
Stateless session bean
Não mantém estado
Serviço completado em única chamada
Extrair raiz quadrada
Stateful session bean
Mantém estado entre chamadas
“Carrinho de compras” em aplicações web (inserir, atualizar,...)
45. Observe que...
Um session bean (stateless ou stateful) pode ser
chamado de uma mesma JVM (local) ou de JVM
diferente daquela em que é executado (remotamente)
Chamada remota ocorre via Java RMI
Um stateless session bean pode ser exposto como
um web service
Um stateful session bean não pode ser exposto
como um web service
46. Em tempo...
Web service, conforme W3C,
“é um software projetado para
oferecer suporte de interação
entre máquinas sobre uma
rede”.
Web API que pode ser explorada sobre uma rede (por exemplo,
47. Em tempo...
Java RMI, segundo a Sun,
“permite que um programador
crie aplicações distribuídas onde
métodos de objetos Java remotos
podem ser invocados de outros
objetos Java, executados em
outras JVMs, possivelmente em
computadores distintos”.
48. Message-driven beans
(MDBs)
Processam lógica de negócio à semelhança de session beans
Diferença:
não são chamados diretamente por um cliente
Quem os chama?
São “disparados” por mensagens enviadas a um
servidor de mensagens
49. Em tempo...
Servidor de mensagens, segundo a Sun,
“fornece um local centralizado para a troca
de informações por meio do envio e
recebimento de mensagens”.
Forma de trocar informações, na forma de mensagens,
entre programas
Há dois modelos: point-to-point e publish/subscribe
50. Servidores de mensagem
(open source)
ActiveMQ
OpenJMS
JORAM
Open Message Queue
Somnifugi
UberMQ, Presumo, Hermes JMS, MantaRay, ...
51. Entity beans
Usado para implementar a camada de persistência
É função da persistência:
Automaticamente armazenar dados de objetos em bancos
de dados relacionais e, no sentido inverso, “dar vida” a
objetos a partir de registros de tabelas em tais bancos”
52. Visão Geral
Java Persistence API (JPA) gerencia entity beans
JPA automaticamente persiste objetos usando ORM
ORM (Object-Relational Mapping)
ORM = mapeamento de dados em objetos para
tabelas por meio de configuração
Sem ORM, o programador tem que escrever código de
“baixo nível” que usa JDBC, vejamos um exemplo...
53. Exemplo JDBC
Sem conexões, sem exceções, ...
Usando código como este, como persistir um objeto?
Como recuperar um objeto?
Como atualizar? E as referências para outros objetos?
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(quot;SELECT a, b, c FROM Table1quot;);
while (rs.next()) {
int x = rs.getInt(quot;aquot;);
String s = rs.getString(quot;bquot;);
float f = rs.getFloat(quot;cquot;);
}
54. Exemplo JPA
Sem conexões, sem exceções, ...
Ao persistir Turma, todos os alunos correspondentes
são persistidos (1->N)
Atributos de turma são persistidos, objetos
referenciados por turma (List de Aluno) são persistidos,
os atributos de cada instância de Aluno são
persistidos, ...
em.persist(turma);
55. Em tempo...
JDBC API
API de acesso a praticamente todo e qualquer dado
armazenado em tabelas
Padrão da indústria para conectividade de aplicações
Java com bancos de dados
Mesmo código é empregado para ter acesso a um
grande número de SGBDs
56. JPA define:
Padrão para criação de configurações de como mapear
objetos para tabelas (ORM)
EntityManager API - API para execução de operações
CRUD (create, remove, update, delete)
Java Persistence Query Language (JPQL) para consultas
57. Recapitulando, JPA
Define como mapear objetos em tabelas (ORM)
Inclui uma API, EntityManager API para que
aplicações possam requisitar serviços de persistência
JPQL para realização de consultas (lembra SQL)
58. Relembrando...
EJB compreende:
EJB contêiner
Persistence provider
O persistence provider é “plugável”, “substituível”, ...
Ou seja, você pode optar pelo persistence provider que
considerar mais apropriado
59. Quais as implementações
disponíveis?
Persistence providers:
JBoss Hibernate
Oracle TopLink
BEA Kodo (uniu-se com Oracle?)
DataNucleous (sucessor do JPOX)
EclipseLink
60. Entity
Um Entity bean é um objeto a ser persistido
JPA usa entity beans para oferecer serviços de
persistência
Session beans modela processos
Entity beans modela conceitos do domínio
Entity beans são manipulados por processos do negócio
Session beans manipulam Entity beans
61. Perspectiva
Session
Entity beans
beans
(substantivos)
(verbos)
Não sobreve vive a Estado é
crahses e shutdowns persistido
62. Como isto funciona?
ORM Entity
Persistence
Requisição via
provider
EntityManager
CRUD
63. EntityManager
package javax.persistence;
public interface EntityManager { ... }
Serviços de persistência são
oferecidos por meio desta interface!
64. O que um
EntityManager faz?
package javax.persistence;
public interface EntityManager { ... }
Usa os metadados (ORM) de uma entidade
para inserir uma entidade na base de dados,
atualizar, remover e recuperar entidades!
65. JPQL
Java Persistence Query Language é uma linguagem
como SQL
Consulta por entidades em uma base de dados!
Exemplo (obter todas as instâncias de Requisito)
SELECT r FROM Requisito r
66. Algumas questões
Precisamos de um persistence provider para executar um MDB?
Precisamos de um contêiner e um persistence provider para executar um stateful
session bean?
Precisamos de um contêiner para executar um stateless session bean e não é
necessário um persistence provider?
Um MDB é proposta para implementar a camada de lógica de negócio, assim como
session beans?
Entity beans é a proposta EJB 3 para implementar a camada de persistência?
Metadados ORM são geralmente fornecidos por meio de anotações Java?
68. Ambiente de execução
• Classe Java é executada pela JVM
public class X {
public static void main(String[] args) {
...
}
}
• Session bean ou Message-Driven Bean (MDB)
exige contêiner EJB
• Entity bean exige um persistence provider
69. Termos relevantes
• Java EE contêiner é um servidor de
aplicações que oferece suporte a EJB 3, um
contêiner web, outras EE APIs e serviços.
• Java EE contêiner, inclui um contêiner EJB
71. Contêiner EJB
• JVM gerencia transparentemente memória
• Contêiner EJB oferece vários serviços
como transação, ...
• Ou seja,
contêiner EJB = JVM estendida
• JVM estendida para executar EJBs
72. Enquanto...
• Na JVM você...
java meupacote.MinhaClasse
• Em um contêiner EJB você faz uma
implantação (ou deployment)
• Colocamos um componente EJB em um
contêiner EJB, deployment, para que este
componente possa usufruir dos serviços
oferecidos pelo contêiner EJB
73. Após o deploy...
• Seu bean, ou seu componente EJB, ou seu
session bean (seja stateful ou stateless) ou
seu message-driven bean (MDB) pode ser
usado pela sua aplicação
• Faz-se o deploy para que a funcionalidade
possa ser usufruída por um cliente
74. Isto se parece com...
• Um objeto que implementa algumas
funções e queremos que aplicações possam
ter acesso a tais funções, possivelmente de
outro ponto em uma rede
• Eu desejo criar objetos que ofereçam
funcionalidades para todo um conjunto de
aplicações
75. JPA é diferente
• Não usa um contêiner (é implementado
por um persistence provider)
• Os serviços oferecidos (CRUD) são
requisitados via interface
EntityManager
• Cliente deve requisitar os serviços a tal
interface
76. Observação
• Contêiner EJB e um persistence provider
não precisam ser do mesmo fornecedor
• Lembre-se: o persistence provider é
separável, destacável, substituível, “plugável”
a um contêiner EJB
77. Importante
• Por que eu preciso de um contêiner EJB?
PRODUTIVIDADE
• Todos os serviços oferecidos podem ser
implementados em cada aplicação, embora
de alto risco, alto custo, ...
• Para usufruir, você cria componentes e os
implanta em um contêiner
78. Ou seja, ...
• EJB 3 resume-se a um conjunto de serviços
que você pode implementar, mas seria
oneroso
• Contêiner EJB e persistence provider
implementa e oferece tais serviços
• Aprender EJB é aprender como usufruir
destes serviços
79. Crítica a EJB 2
• Era muito complexo usufruir dos serviços
• Implementá-los era inviável, usá-los era
difícil
• EJB 3 é uma “revolução” quanto ao uso dos
serviços
80. Quais os serviços? (1/4)
• Integração via injeção de dependência
[session beans e MDBs]
• Pooling. Contêiner cria um pool de instâncias
[stateless session beans e MDBs]
• Thread-safety. Todos os componentes EJB são
thread-safe [session beans e MDBs]
• Gerência de estado. Contêiner gerencia o
estado de [stateful session beans]. Você pode
guardar estado em tal tipo de bean como se fosse
um objeto de aplicação convencional.
81. Quais os serviços? (2/4)
• Troca de mensagens. Componentes que
consomem mensagens sem detalhes de Java
Messaging Service (JMS) API.
[Message-driven beans]
• Transações. Gerência declarativa de transações
(sem código). Se o método termina normalmente,
então é executado um commit, caso contrário, um
rollback. [session beans e MDBs]
• Segurança. Configurada (sem necessidade de
código) [session beans]
82. Quais os serviços? (3/4)
• Interceptadores. Forma “light” de AOP via
configuração. [session beans e MDBs]
• Acesso remoto. Componentes podem ser
acessados remotamente (sem código adicional).
Cliente acessa como se fosse local via injeção de
dependência. [session beans]
• Web services. Transparentemente torna
componentes em serviços web. [stateless session
beans]
83. Quais os serviços? (4/4)
• Persistência. Alternativa ao oneroso uso de
JDBC. [entity beans]
• Caching e desempenho. JPA oferece serviços
de caching e otimização de desempenho. [entity
beans]
84. Óbvio
• Se os serviços apresentados anteriormente
não são relevantes para a aplicação, então o
uso de EJB 3 não é aconselhado.
85. Como é um bean?
• Já foi dito, uma classe com anotação
• A classe
public class StringBean implements StringInterface {
public String maiuscula(String entrada) {
return entrada != null : entrada.toUpperCase() : “NULL”;
}
}
86. A “transformação”
• A classe devidamente anotada, agora um
stateless session bean
import javax.ejb.Stateless;
@Stateless
public class StringBean implements StringInterface {
public String maiuscula(String entrada) {
return entrada != null : entrada.toUpperCase() : “NULL”;
}
}
87. Como executar?
• Precisamos:
• Compilar
• Executar o deploy
• Criar um cliente que faz uma requisição
• Fique tranquilo, faremos isto (não agora)
88. Como seria o cliente?
• Cliente (usando injeção de dependência)
import javax.ejb.EJB;
...
@EJB
public StringInterface strImpl;
...
void metodo() {
String x = strImpl.maiuscula(“teste”);
// Neste ponto, x deve ser “TESTE”
}
89. JPA (detalhe)
• JPA é uma solução de persistência para
toda e qualquer aplicação Java
• Ou seja, não é necessário um contêiner
• Não é necessário um servidor de
aplicações
• O persistence provider é suficiente