Repensando padrõese boas práticas Java EE       Adriano Tavares   adriano.tavares@arkhi.com.br         20 de Outubro, 2012
Palestranteü Adriano de Pinho Tavares;ü Arquiteto de Software na Arkhi;ü Certificações relevantes;  –  SCJP, SCEA, IBMO...
Motivação                   ...evitarRepensar os                  padrões  padrões                  obsoletos JavaEE...   ...
Tópicosü Breve história do J2EE;ü Core J2EE patterns;ü A evolução do J2EE para o Java EE;ü Repensando padrões Java EE;...
Breve história do J2EE1995: Applets                1996: Servlets                         1997: EJB                       ...
EJB 2 Statelesspublic class HelloWorldBean implements SessionBean {    public   void   setSessionContext(SessionContext sc...
EJB 2 Interfacespublic interface HelloWorldRemoteHome extends EJBHome {   HelloWorldRemote create() throws CreateException...
EJB 2 XML Deployment                   Descriptor<ejb-jar>     <display-name>HelloWorldEJB</display-name>     <enterprise-...
Maior equívoco do EJB 2ü Persistência com EJB 2.x CMP  –  Entidade persistentes podem ser     acessadas remotamente;  –  ...
Core J2EE Patternsü Mesmo para lógicas simples artefatos   obrigatórios;ü Código altamente dependente da   API;ü A sepa...
Core J2EE Patterns(2001)         (2003)
EJB 2: Modelo de programação           Pesado
Mesmo pesado, porque o          J2EE se popularizou?ü  Benefícios   –  Padronização;   –  Servidor de Aplicação;   –  Mul...
Frameworks Nightmare
A Evolução para o Java EE                             Leve                          Portável                        Extens...
...do J2EE para o Java EE!      2006: Java EE 5novo modelo de programação 2009: Java EE 6 simples, enxuto e leve.         ...
Java EE: XML vai pro banco...    ...entra Annotation!
Java EE, princípiosConvention over Configuration• XML opcional;Aspect-Oriented Programming• Pontos de extenção;Context and...
EJB 3 Session Bean@Statelesspublic class HelloWorldBean {    public String sayHello(String name) {      return "Hello from...
CDIü  Ao invés códigos de baixo nível:try{    Context ctx = new InitialContext();    Object proxy = ctx.lookup(“service”)...
Injeção de EJBs@Statelesspublic class HelloWorldBean {    @EJB    private Service service;    public String sayHello(Strin...
Uso da anotação @EJBServlet       JSP         JSF           Java ClientJAX-WS                   JAX-RS          (Main Clas...
EJB 3 com JPA@Statelesspublic class BookServiceBean {    @PersistenceContext    private EntityManager em;    public void c...
EJB 3 Transações@Stateless@TransactionAttribute(       TransactionAttributeType.MANDATORY)public class BookServiceBean {  ...
Injeção de outros Recursos@Statelesspublic class DataSourceInjectionBean {    @Resource(name = "mail/Context")    private ...
Repensando padrões Java EE
Core J2EE patterns hojeü Continuam   populares;ü Alguns padrões   validos, outros   opcionais, outros   obsoletos;ü Pro...
Real World Java EE Patterns     (2009)         (2012)
DAO + DTO: Dead or Alive?Problemaü Encapsular   Persistência   com EJB 2;Solução                  Obsoletoü DRY!ü JPA +...
Service LocatorProblemaü Encapsular Lookup JNDI para acessar EJB   ou outros recursos;Soluçãoü DRY!                    O...
Composite EntityProblemaü A persistência com CMP 2.1 não   suporta relacionamentos muito bem;Solução                  Obs...
Value Object AssemblerProblemaü Montagem de DTOsSolução                      Obsoletoü JPA + EJB 3.
Business DelegateProblemaü O cliente EJB tinha que capturar, ou   pelo menos esconder, as exceções de   EJB 2;Solução    ...
Value list HandleProblemaü Paginação de EJB 2Soluçãoü JPA + EJB 3                        Obsoletoü Desde a introdução d...
Arquiteturas JavaEE Enxutas“Soluções pragmáticas ao invés de  infinitas indireções, frameworks,  camadas, e padrões.”-- Ad...
Forma leve de desenhar      aplicações   Entity, objetos persistentes   Control, lógicas de negócio   Boundary, interfaces.
Diferença de abordagem SOA             DDD   Foco na     Foco em objetosinterface do    com estado e    serviço    comport...
Entity Control Boundary Pattern             Service   Service      Valido    Persistente Facade ou  Gateway               ...
DEMOü Aplicação Finace  –  Java EE 6;    ü  EJB 3    ü  JPA    ü  JSF    ü  Prime Faces  –  Netbeans 7.2;  –  Java DB.
Conclusão e Perguntas
Participe da rede Pangea       http://pangeanet.orgA primeira rede social sobre arquitetura de software do Brasil.
Repensando padrões e boas práticas java ee
Repensando padrões e boas práticas java ee
Upcoming SlideShare
Loading in …5
×

Repensando padrões e boas práticas java ee

4,322 views
4,222 views

Published on

A apresentação visa repensar os padrões JavaEE para evitar o uso de padrões obsoletos, focando no container server-side, para criar arquiteturas enxutas.

Published in: Technology

Repensando padrões e boas práticas java ee

  1. 1. Repensando padrõese boas práticas Java EE Adriano Tavares adriano.tavares@arkhi.com.br 20 de Outubro, 2012
  2. 2. Palestranteü Adriano de Pinho Tavares;ü Arquiteto de Software na Arkhi;ü Certificações relevantes; –  SCJP, SCEA, IBMOOAD, IBMRUP, IBMSOA;ü Blog: http://adrianotavares.com
  3. 3. Motivação ...evitarRepensar os padrões padrões obsoletos JavaEE... J2EE... ...criar ... foco no arquiteturas container enxutasserver-side... JavaEE.
  4. 4. Tópicosü Breve história do J2EE;ü Core J2EE patterns;ü A evolução do J2EE para o Java EE;ü Repensando padrões Java EE;ü Arquiteturas enxutas; –  Padrões para SOA e DDD;ü Conclusão e perguntas.
  5. 5. Breve história do J2EE1995: Applets 1996: Servlets 1997: EJB 1998: JMS1999: J2EE 1.2,Nasce a plataforma J2EE 2001: J2EE 1.3, Core J2EE Patterns 2003: J2EE 1.4
  6. 6. EJB 2 Statelesspublic class HelloWorldBean implements SessionBean { public void setSessionContext(SessionContext sc) { } public void ejbCreate() {} public void ejbActivate() {} //SFSB only public void ejbPassivate() {}//SFSB only public void ejbRemove() {} public void sayHello() { System.out.println("Hello!"); }}
  7. 7. EJB 2 Interfacespublic interface HelloWorldRemoteHome extends EJBHome { HelloWorldRemote create() throws CreateException,RemoteException;}public interface HelloWorldRemote extends EJBObject { void sayHello() throws RemoteException;}public interface HelloWorldLocalHome extends EJBLocalHome { HelloWorldLocal create() throws CreateException;}public interface HelloWorldLocal extends EJBLocalObject { void sayHello();}
  8. 8. EJB 2 XML Deployment Descriptor<ejb-jar> <display-name>HelloWorldEJB</display-name> <enterprise-beans> <session> <display-name>HelloWorldSB</display-name> <ejb-name>HelloWorldBean</ejb-name> <home>...helloworld.HelloWorldRemoteHome</home> <remote>...helloworld.HelloWorldRemote</remote> <ejb-class>...helloworld.HelloWorldBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>HelloWorldBean</ejb-name> <method-name>sayHello</method-name> </method> <trans-attribute>RequiresNew</trans-attribute> </container-transaction> </assembly-descriptor></ejb-jar>
  9. 9. Maior equívoco do EJB 2ü Persistência com EJB 2.x CMP –  Entidade persistentes podem ser acessadas remotamente; –  Baixo desempenho; –  No pior caso, cada getter e setter abria uma nova transação;ü Necessidade de boas práticas, como Session Facade.
  10. 10. Core J2EE Patternsü Mesmo para lógicas simples artefatos obrigatórios;ü Código altamente dependente da API;ü A separação entre a realização funcional e a plataforma não existia;ü Muitos padrões foram introduzidos para encapsular a API EJB 2.
  11. 11. Core J2EE Patterns(2001) (2003)
  12. 12. EJB 2: Modelo de programação Pesado
  13. 13. Mesmo pesado, porque o J2EE se popularizou?ü  Benefícios –  Padronização; –  Servidor de Aplicação; –  Multicamadas; –  Aplicações Web; –  Acesso Remoto; –  Modelo Single-thread; –  Gerenciamento de estado; –  Controle de transação e concorrência; –  Tudo isso aplicado de forma declarativa (XML), sem codificação...
  14. 14. Frameworks Nightmare
  15. 15. A Evolução para o Java EE Leve Portável Extensível Alto-Desempenho Simples Fácil de desenvolver.
  16. 16. ...do J2EE para o Java EE! 2006: Java EE 5novo modelo de programação 2009: Java EE 6 simples, enxuto e leve. 2012: Java EE 7 Q4 Cloud computing
  17. 17. Java EE: XML vai pro banco... ...entra Annotation!
  18. 18. Java EE, princípiosConvention over Configuration• XML opcional;Aspect-Oriented Programming• Pontos de extenção;Context and Dependency Injection• Código limpo.
  19. 19. EJB 3 Session Bean@Statelesspublic class HelloWorldBean { public String sayHello(String name) { return "Hello from: ” + name; }}
  20. 20. CDIü  Ao invés códigos de baixo nível:try{ Context ctx = new InitialContext(); Object proxy = ctx.lookup(“service”); ServiceHome home =(ServiceHome)PortableRemoteObject.narrow(proxy,ServiceHome.class); Service service = home.create();}catch(Exception ex){}ü  Ou encapsulamento com padrões (Factory):Service service = ServiceFactory.getInstance().createService();ü  Apenas injeção de dependências:@EJBprivate Service service;
  21. 21. Injeção de EJBs@Statelesspublic class HelloWorldBean { @EJB private Service service; public String sayHello(String id) { return "Hello ” + service.getName(id); }}
  22. 22. Uso da anotação @EJBServlet JSP JSF Java ClientJAX-WS JAX-RS (Main Class) EJB
  23. 23. EJB 3 com JPA@Statelesspublic class BookServiceBean { @PersistenceContext private EntityManager em; public void create(Book book) { em.persist(book); }}
  24. 24. EJB 3 Transações@Stateless@TransactionAttribute( TransactionAttributeType.MANDATORY)public class BookServiceBean { @PersistenceContext private EntityManager em; public void create(Book book) { em.persist(book); }}
  25. 25. Injeção de outros Recursos@Statelesspublic class DataSourceInjectionBean { @Resource(name = "mail/Context") private Session mailContext; @Resource(name = "jms/Queue") private Queue queue; @Resource(name = "jms/ConnectionFactory") private ConnectionFactory eocFactory; @Resource(name="jdbc/sample") private DataSource ds; public void accessResources(){ //use resources }}
  26. 26. Repensando padrões Java EE
  27. 27. Core J2EE patterns hojeü Continuam populares;ü Alguns padrões validos, outros opcionais, outros obsoletos;ü Problemas resolvidos no JavaEE.
  28. 28. Real World Java EE Patterns (2009) (2012)
  29. 29. DAO + DTO: Dead or Alive?Problemaü Encapsular Persistência com EJB 2;Solução Obsoletoü DRY!ü JPA + EJB 3.
  30. 30. Service LocatorProblemaü Encapsular Lookup JNDI para acessar EJB ou outros recursos;Soluçãoü DRY! Opcionalü CDI + EJB 3;ü Interfaces opcionais;ü Para os casos excepcionais BeanLocator.
  31. 31. Composite EntityProblemaü A persistência com CMP 2.1 não suporta relacionamentos muito bem;Solução Obsoletoü JPAü Entidades JPA orientadas a objeto.
  32. 32. Value Object AssemblerProblemaü Montagem de DTOsSolução Obsoletoü JPA + EJB 3.
  33. 33. Business DelegateProblemaü O cliente EJB tinha que capturar, ou pelo menos esconder, as exceções de EJB 2;Solução Obsoletoü CDI + EJB 3;ü As exceções de EJB 2 foram convertidos para exceções do sistema.
  34. 34. Value list HandleProblemaü Paginação de EJB 2Soluçãoü JPA + EJB 3 Obsoletoü Desde a introdução do JPA as entidades podem ser facilmente desacopladas sem esforço adicional.
  35. 35. Arquiteturas JavaEE Enxutas“Soluções pragmáticas ao invés de infinitas indireções, frameworks, camadas, e padrões.”-- Adam Bien
  36. 36. Forma leve de desenhar aplicações Entity, objetos persistentes Control, lógicas de negócio Boundary, interfaces.
  37. 37. Diferença de abordagem SOA DDD Foco na Foco em objetosinterface do com estado e serviço comportamento Tende a ser tende a ser stateless stateful
  38. 38. Entity Control Boundary Pattern Service Service Valido Persistente Facade ou Gateway Data Object
  39. 39. DEMOü Aplicação Finace –  Java EE 6; ü  EJB 3 ü  JPA ü  JSF ü  Prime Faces –  Netbeans 7.2; –  Java DB.
  40. 40. Conclusão e Perguntas
  41. 41. Participe da rede Pangea http://pangeanet.orgA primeira rede social sobre arquitetura de software do Brasil.

×