Os Melhores do Mundo, um comparativo entre Spring e EJB 3.0
-
Upload
rafael-carneiro -
Category
Technology
-
view
4.301 -
download
1
description
Transcript of Os Melhores do Mundo, um comparativo entre Spring e EJB 3.0
Os melhores do mundo: comparativo
entre Spring e EJB 3.0
Super Heroes
� CEJUG Leader� Coordenador Portal Java� Desenvolvedor Java na
� Entusiasta Java� Membro do CEJUG� Atualmente trabalha
Tarso Bessa Rafael Carneiro
� Desenvolvedor Java na IVIA� Desenvolvedor do CEJUG-Classifieds(OpenSource)� Blog: www.rafaelcarneiro.org
� Atualmente trabalha como Arquiteto Java na IVIA� Um dos desenvolvedores do CEJUG-Classifieds(OpenSource)
� Objetivos� Ambiente� Injeção de Dependência� Transações� Agendamento
Agenda
� Agendamento� AOP� Web services� Serviço de mensagens� Segurança� Conclusão
� Comparar as funcionalidades das duas tecnologias.
� Mostrar as vantagens e desvantagens.
� Criar uma aplicação de mercado com as duas
Objetivos
� Criar uma aplicação de mercado com as duas tecnologias a fim de mostrar os recursos de cada uma.
� O foco não é ensinar como usar, apenas compará-las.
� Objetivos� Ambiente� Injeção de Dependência� Transações� Agendamento
Agenda
� Agendamento� AOP� Web services� Serviço de mensagens� Segurança� Conclusão
Ambiente
� JDK 1.6� JDK 1.6
� JBoss 4.2.2� Tomcat 6.0.14
� Apache ActiveMQ 5
� CXF 2.0
� Objetivos� Ambiente� Injeção de Dependência� Transações� Agendamento
Agenda
� Agendamento� AOP� Web services� Serviço de mensagens� Segurança� Conclusão
Spring: Injeção de Dependência
� 3 Tipos (Construtor, Propriedade, Método de fábrica)
� A configuração pode ser por XML ou Anotações (maioria dos casos).
Spring: D.I.
� Suporta Autowiring
� Possui elementos próprios para Collections e Properties
� map, set, list, props
� Oferece Lazy-Initialization
� Possui vários escopos:� singleton – uma única instância no Container� prototype – várias instâncias no Container� request – uma instância por request
(HttpServletRequest)
Spring: D.I.
(HttpServletRequest)� session – uma instância por Sessão
(HttpSession)� globalSession – semelhante a session, mas
voltado para portlets.
� Suporte as anotações @PostConstruct, @PreDestroy e @Resource
Exemplo
EJB: Injeção de Dependência
� ENC JNDI (Enterprise Naming Context)
� Podem ter valores primitivos, referências a interfaces EJB, JMS, JCA, databases
EJB: D.I.
� Tipos de anotações: @EJB, @Resource, @PersistenceUnit, @PersistenceContext e @WebServiceRef
� Funciona com herança (com algumas restrições)
� Todas as anotações podem ser configuradas via XML
� Necessita de um container EJB
EJB: D.I.
Exemplo
3 tipos de
D.I
Nem tudo deve ser EJB!
Exemplo: fazer com que
EJB: D.I. Anti-pattern
Exemplo: fazer com quetodos os DAOs sejam EJBs.
DI: Spring e EJB
Artefatos Necessários
Spring
�XML de configuração do Container (mesmo �XML de configuração do Container (mesmo usando anotações).
� ServletContextListener no web.xml.
EJB� Nenhum.
DI: Spring e EJB
Nível de Dificuldade
Spring� Fácil.
EJB� Fácil.
DI: Spring e EJBVantagens
Spring� Usa somente POJOs� Flexível para instanciar os beans (3 tipos de injeção de dep.)de dep.)� Elimina necessidade de padrões como ServiceLocator e BusinessDelegate
EJB� Não precisa de configuração adicional� Elimina a necessidade de ServiceLocator e BusinessDelegate� Controle do ciclo de vida dos EJBs
DI: Spring e EJBDesvantagens
Spring� Mesmo com a configuração via anotações, ainda é necessário incluir um bean no XML (em alguns casos, exemplo: AOP).exemplo: AOP).
EJB� É necessário um EJB Container para realizar a injeção de dependência de componentes ou um Client Container específico. Exemplo: o Web Container não entende anotações como @Resourceou @EJB.
� Objetivos� Ambiente� Injeção de Dependência� Transações� Agendamento
Agenda
� Agendamento� AOP� Web services� Serviço de mensagens� Segurança� Conclusão
Spring: Transações
� Promove modelo único de configuração independente da tecnologia ou frameworks
� Usa AOP para a configuração
Spring: Transações
� Configuração via xml ou anotações.
� Tipos de Propagação: Required, RequiresNew, Nested, Supports, Never.
� Permite controle sobre o rollback baseado em tipos de exceção
Exemplo
O QUE FAZER
AONDE
EJB: Transações
� É recomendável utilizar o controle de transação do container
� Tipos de atributos de transação disponíveis utilizando a anotação @TransactionAttribute:
EJB: Transações
utilizando a anotação @TransactionAttribute: NotSupported, Supports, Required, RequiresNew, Mandatory e Never
� Gerenciamento explícito de transação: através da anotação @TransactionManagement e da interface UserTransaction
Transações: Spring e EJBArtefatos Necessários
Spring� Necessita de configuração via XML, mesmo usando anotações.
EJB� Anotações nos componentes em que se deseja alterar as características padrões fornecidas pelo Container.
Transações: Spring e EJBNível de Dificuldade
Spring� Fácil. A configuração é feita utilizando AOP, portanto é desejável ter conhecimento de alguns conceitos.
EJB� Fácil. No entanto, utilizar o controle transacional de forma programática pode tornar a manipulação das transações trabalhosa. Os autores enfatizam ter um conhecimento abrangente em controle de transações para efetuar mudanças.
Transações: Spring e EJBVantagens
Spring� Dispõe de um modelo único de configuração, independente da API usada (JTA, Hibernate, JDBC) e abstrai o uso de transações locais e globais.abstrai o uso de transações locais e globais.
EJB� O Container não precisa de configuração adicional caso não se deseje efetuar um controle mais fino.
Transações: Spring e EJBDesvantagens
Spring� Nenhuma.
EJBEJB� Aplica-se somente a EJBs.
� Objetivos� Ambiente� Injeção de Dependência� Transações� Agendamento
Agenda
� Agendamento� AOP� Web services� Serviço de mensagens� Segurança� Conclusão
Spring: Agendamento
� Configuração declarativa
� Atualmente suporta o Quartz e o Timer (JDK)
� Quartz:
Spring: Agendamento
� Quartz:� Os beans não precisam de dependências
com a API� Opções avançadas para agendamento
� A partir da versão 2.0, possui suporte ao TaskExecutor (JDK 5) para Thread Pooling.
Exemplo
Exemplo
� Sem dependências com o Quartz
EJB: Agendamento
� Indicado para processamentos em batch
� Semelhante ao java.util.Timer do Java SE
� Configurações através da interface TimerService
EJB: Agendamento
� Configurações através da interface TimerService
� Lógica do negócio para o agendamento presente no método que possui a anotação @Timeout
Exemplo
Exemplo
Agendamento: Spring e EJBArtefatos Necessários
Spring� Caso o Quartz venha a ser utilizado, deve-se incluir sua API.� Configuração em XML.� Configuração em XML.� Classe POJO que executa a operação
EJB� EJB para executar a operação
Agendamento: Spring e EJBNível de Dificuldade
Spring� Fácil, porém requer conhecimentos em Quartz, caso este venha a ser usado.
EJB� Fácil.
Agendamento: Spring e EJBVantagens
Spring� Bem mais flexível que o TimerService do Container EJB.� A classe do job não precisa ter dependência com o � A classe do job não precisa ter dependência com o Quartz
EJB� Suporte padrão da especificação.
Agendamento: Spring e EJBDesvantagens
Spring� Ainda requer uma boa quantidade de configuração em XML para ter recursos avançados.
EJB� Não é flexível e possui poucos recursos avançados. � Necessita ser disparado via código.
� Objetivos� Ambiente� Injeção de Dependência� Transações� Agendamento
Agenda
� Agendamento� AOP� Web services� Serviço de mensagens� Segurança� Conclusão
Spring: AOP
� Pode ser usada através de AspectJ e Spring AOP.
� Configuração via xml ou Annotations.
� Usada pelo próprio container para controle
Spring: AOP
� Usada pelo próprio container para controle transacional.
� Pode ser aplicada a qualquer bean do Container.
Exemplo
execution(* *.service.impl.OrderServiceImpl.checkout(..)) and args(order)
Exemplo
EJB: AOP
� AOP na especificação EJB se chama interceptors
� Não precisa ser um EJB
� A anotação @AroundInvoke marca o trecho de
EJB: AOP
� A anotação @AroundInvoke marca o trecho de código que irá ser executado
� Utilizar a anotação @Interceptors para registrar os aspectos
� Pode ser configurado via XML
Exemplo
Exemplo
AOP: Spring e EJBArtefatos Necessários
Spring� APIs do AspectJ ou Spring AOP� Classe POJO para o aspecto.� Configuração em XML, independente do uso de � Configuração em XML, independente do uso de Anotações.
EJB� Classe POJO para ser o interceptador.� Anotar as classes ou métodos a serem interceptados.
AOP: Spring e EJBNível de Dificuldade
Spring� Fácil. Necessário uma leitura com cautela na documentação do Spring (e AspectJ, se for caso) .
EJB� Fácil.
AOP: Spring e EJBVantagens
Spring� AspectJ é bastante poderoso e permite usar inúmeros pointcuts (Around, Before, After, AfterReturn)AfterReturn)� Não invasiva. Instâncias que serão interceptadas não precisam de configuração em suas classes.
EJB� Suporte padrão da especificação.
AOP: Spring e EJBDesvantagens
Spring� Usar uma API que não é padrão.� Necessitar de configuração em XML, mesmo usando anotações.usando anotações.
EJB� Invasiva se usada com anotações. Necessita marcar a classe ou método que será interceptada.� Só tem suporte para um tipo de pointcut: Around.� Só se aplica a EJBs.
� Objetivos� Ambiente� Injeção de Dependência� Transações� Agendamento
Agenda
� Agendamento� AOP� Web services� Serviço de mensagens� Segurança� Conclusão
Spring: Web Services
� Expõe qualquer bean via web services
� Pode ser usado via Spring-WS� Modelo Contract First� Necessita de implementação adicional
Spring: Web Services
� Necessita de implementação adicional
� Pode ser combinado com CXF (Nova versão do XFire):
� Modelo Contract Last� Não requer implementação adicional� Suporte as anotações de WS como
@WebService, @WebMethod
Exemplo
� Usando o CXF
Exemplo
EJB: Web Services
� Podem ser acessados através de um EJB
� Principais anotações: @WebService, @WebMethod, @WebParam, @WebResult, @OneWay, @WebServiceRef,
EJB: Web Services
@OneWay, @WebServiceRef, @WebServiceClient e @SOAPBinding
� Podem ser implantados via XML
Exemplo
Web Services: Spring e EJBArtefatos Necessários
Spring� Usar uma API para Web Service: Spring-WS ou CXF.� Configuração de XML necessária, mesmo usando � Configuração de XML necessária, mesmo usando anotações.
EJB� Nenhum se não desejar gerar o WSDL dinamicamente.
Web Services: Spring e EJBNível de Dificuldade
Spring� Médio. Precisa conhecer a configuração da API utilizada.
EJB� Médio. Utilizando o servidor de aplicação JBoss 4.2, foi necessário utilizar o sistema de endorsed jars do Java.
Web Services: Spring e EJBVantagens
Spring� Expor beans configurados no Container.� Flexível quanto a escolha da API utilizada.
EJB� Padrão definido pela especificação.
Web Services: Spring e EJBDesvantagens
Spring� Configuração via XML mesmo utilizando anotações (no caso do CXF).
EJB� Não funciona com o Java 6 (no caso do JBoss). É necessário utilizar o esquema de endorsed jars.
� Objetivos� Ambiente� Injeção de Dependência� Transações� Agendamento
Agenda
� Agendamento� AOP� Web services� Serviço de mensagens� Segurança� Conclusão
Spring: Serviços de Mensagens
Spring: Serviços de Mensagens
� O Container do Spring não possui um Message Broker (MB).
� É preciso incorporar um MB ou utilizar o do servidor de aplicação, caso este venha a dispor de um. Ex.: de aplicação, caso este venha a dispor de um. Ex.: JBoss
� O ActiveMQ da Apache possui boa integração com Spring
Spring: Serviços de Mensagens
� Possui a classe JmsTemplate para facilitar o uso de enviar mensagens e consumi-las (se for o caso).
� Possui Listener-Containers para escutar filas de mensagens e disparar ações em beans.mensagens e disparar ações em beans.
� Permite definir número de Threads para processamento
� Beans não precisam implementar MessageListener (Opcional).
� Possui conversores de tipos de mensagens: MapMessage, ObjectMessage, TextMessage...
Exemplo
� Configuração de um Listener JMS
Exemplo
�JMSTemplate para simplificar a comunicação com filas
Exemplo
�Envio de mensagens
� Processamento da mensagem (sem dep. JMS)
EJB: Serviços de Mensagens
EJB: Serviços de Mensagens
� As mensagens são processadas por Message
Driven Bean
� Devem implementar a interface MessageListener
� São identificados através da anotação @MessageDriven
� O método onMessage() contém a lógica do negócio
� É configurado através da anotação @ActivationConfigProperty
EJB: Serviços de Mensagens
� Possuem anotações de callback: @PostConstruct e @PreDestroy
� Podem enviar mensagens JMS
� Podem ser configurados via XML
Exemplo
� Enviando uma mensagem JMS
Exemplo
� Enviando uma mensagem JMS
Exemplo
� MessageDriven Bean
Exemplo
� MessageDriven Bean
Mensagens: Spring e EJBArtefatos Necessários
Spring� Configurar um Message Broker. Incluir as APIs se for executá-lo no modo embedded.� Criar uma classe POJO para receber as mensagens� Definir um Listener Container para notificar os POJO� Definir um Listener Container para notificar os POJO� Configurar uma instância de JmsTemplate para envio.
EJB� É preciso obter os recursos ConnectionFactory e Queue
(no exemplo utilizado)� 7 linhas de código para enviar uma mensagem� Classe Java anotada com @MessageDriven
Mensagens: Spring e EJBNível de Dificuldade
Spring� Médio. Necessário conhecimento de configuração do Message Broker.
EJB� Médio. É preciso entender o conceito de JMS.
Mensagens: Spring e EJBVantagens
Spring� Usar beans do Container para receber mensagens.� Redução de codificação e nenhuma dependência com JMS.com JMS.� Escolha do Message Broker.
EJB� Padrão definido pela especificação.� O Container EJB já possui um Message Broker.
Mensagens: Spring e EJBDesvantagens
Spring� Configuração inicial um pouco extensa.� Incorporar APIs externas para o MB.
EJB� Muita linha de código para enviar mensagem. A especificação não fornece uma forma simples para a sua utilização, como uma abstração.
� Objetivos� Ambiente� Injeção de Dependência� Transações� Agendamento
Agenda
� Agendamento� AOP� Web services� Serviço de mensagens� Segurança� Conclusão
Spring: Segurança
Spring: Segurança
� Feita pela extensão de segurança do Spring: O Spring Security
� Configuração tradicional, da mesma forma que se configura o Springconfigura o Spring
� Promove uma cadeia de filtros para autenticação, autorização
� Mecanismo bastante extensível e compatível com CMA, JAAS
Spring: Segurança
� As regras de segurança não precisam ser declaradas em xml.
�Protege objetos de domínio com suporte as anotações da JSR 250 (@RolesAllowed, @DenyAll)anotações da JSR 250 (@RolesAllowed, @DenyAll)
� Oferece controle de limite de logins, autenticação do tipo “Run As” e serviço de lembrança de senha.
Exemplo
Exemplo
EJB: Segurança
EJB: Segurança
� Pode ser feita declarativamente e programaticamente
� Principais anotações: @RunAs, @PermitAll, @DenyAll, @DeclareRoles e @RolesAllowed@DenyAll, @DeclareRoles e @RolesAllowed
� Somente os session beans podem ser seguros no ambiente EJB
� Pode ser configurado via XML
Exemplo
� Web.xml
Exemplo
� Web.xml
Exemplo
� login-config.xml
Exemplo
� jboss-web.xml
� jboss.xml
Exemplo
� Anotação na classe do bean
Segurança: Spring e EJBArtefatos Necessários
Spring� Incluir as APIs do Spring Security.� Configuração de filtros no web.xml� Configuração via XML do Spring Security� Configuração via XML do Spring Security
EJB� configuração declarativa via XML no Container EJB� arquivos de propriedades (users.properties e roles.properties)� incluir anotações nos EJBs� configurar o Deployment Descriptor do Web Container
Segurança: Spring e EJBNível de Dificuldade
Spring� Médio.
EJBEJB� Difícil. Segurança no Container EJB não é trivial.
Segurança: Spring e EJBVantagens
Spring� Incorporado ao Container do Spring, facilitando a integração da autenticação e autorização com o beans já configurados.beans já configurados.
EJB� Utilização da especificação.
Segurança: Spring e EJBDesvantagens
Spring� Nenhuma.
EJBEJB� Pouco material contundente na Internet.� Nível de complexidade alto.� Muita configuração via XML.
� Objetivos� Ambiente� Injeção de Dependência� Transações� Agendamento
Agenda
� Agendamento� AOP� Web services� Serviço de mensagens� Segurança� Conclusão
Conclusão
� O container do Spring requer uma boa quantidade de configuração em XML, porém ainda é mais poderoso que o Container EJB, principalmente em injeção de dependência.
� O Spring está incorporando Anotações para configuração, mas ainda requer algo em XML.
� Apesar de ser open-source, é mantido por uma única empresa, a SpringSource (Interface21).
Conclusão
� O Spring oferece um mecanismo “plugável” para incorporação de serviços semelhantes aos do EJB Container.
� Apesar do EJB 3.0 ser bastante fácil de utilizar, ele � Apesar do EJB 3.0 ser bastante fácil de utilizar, ele não possui um mecanismo de integração com frameworks conhecidos do mercado. Já o contrário disto, o Spring fornece integração e suporte para os melhores do mercado.
� O EJB tem a vantagem de fazer parte do JCP, sendo assim uma especificação.
Conclusão
� A especificação EJB precisa melhorar o suporte das anotações em outros Containers.
� As duas soluções (Spring e EJB) não são exclusivas. É possível combiná-las para tirar o melhor de cada mundo.
Perguntas?
Agradecer queremos...
Que a força esteja comesteja comvocês!
Apoio