Os Melhores do Mundo, um comparativo entre Spring e EJB 3.0

Post on 22-May-2015

4.301 views 1 download

description

Palestra ministrada no Just Java 08

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

rafaelcarneirob@gmail.com

� Atualmente trabalha como Arquiteto Java na IVIA� Um dos desenvolvedores do CEJUG-Classifieds(OpenSource)

tarso.bessa@gmail.com

� 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