Repensando padrões
e 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, IBMOOAD, IBMRUP, IBMSOA;


ü Blog: http://adrianotavares.com
Motivação
                   ...evitar
Repensar os
                  padrões
  padrões
                  obsoletos
 JavaEE...
                    J2EE...

                    ...criar
 ... foco no
                 arquiteturas
 container
                   enxutas
server-side...
                   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;
ü Arquiteturas enxutas;
  –  Padrões para SOA e DDD;
ü Conclusão e perguntas.
Breve história do J2EE
1995: Applets
                1996: Servlets
                         1997: EJB

                                 1998: JMS

1999: J2EE 1.2,
Nasce a plataforma J2EE
          2001: J2EE 1.3,
          Core J2EE Patterns

                   2003: J2EE 1.4
EJB 2 Stateless
public 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!");
    }
}
EJB 2 Interfaces
public 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();
}
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>
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.
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.
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;
   –  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...
Frameworks Nightmare
A Evolução para o Java EE
                             Leve
                          Portável
                        Extensível
                Alto-Desempenho
                          Simples
             Fácil de desenvolver.
...do J2EE para o Java EE!
      2006: Java EE 5
novo modelo de programação




 2009: Java EE 6
 simples, enxuto e leve.



                           2012: Java EE 7 Q4
                           Cloud computing
Java EE: XML vai pro banco...
    ...entra Annotation!
Java EE, princípios

Convention over Configuration
• XML opcional;

Aspect-Oriented Programming
• Pontos de extenção;

Context and Dependency Injection
• Código limpo.
EJB 3 Session Bean
@Stateless
public class HelloWorldBean {

    public String sayHello(String name) {
      return "Hello from: ” + name;
    }

}
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:
@EJB
private Service service;
Injeção de EJBs
@Stateless
public class HelloWorldBean {

    @EJB
    private Service service;

    public String sayHello(String id) {
       return "Hello ” + service.getName(id);
    }

}
Uso da anotação @EJB

Servlet       JSP         JSF



           Java Client
JAX-WS                   JAX-RS
          (Main Class)



              EJB
EJB 3 com JPA
@Stateless
public class BookServiceBean {

    @PersistenceContext
    private EntityManager em;

    public void create(Book book) {
      em.persist(book);
    }
}
EJB 3 Transações
@Stateless
@TransactionAttribute(
       TransactionAttributeType.MANDATORY)
public class BookServiceBean {

    @PersistenceContext
    private EntityManager em;

    public void create(Book book) {
       em.persist(book);
    }
}
Injeção de outros Recursos
@Stateless
public 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
    }
}
Repensando padrões Java EE
Core J2EE patterns hoje
ü Continuam
   populares;
ü Alguns padrões
   validos, outros
   opcionais, outros
   obsoletos;
ü Problemas
   resolvidos no
   JavaEE.
Real World Java EE Patterns




     (2009)         (2012)
DAO + DTO: Dead or Alive?
Problema
ü Encapsular
   Persistência
   com EJB 2;
Solução
                  Obsoleto
ü DRY!
ü JPA + EJB 3.
Service Locator
Problema
ü Encapsular Lookup JNDI para acessar EJB
   ou outros recursos;
Solução
ü DRY!                    Opcional
ü CDI + EJB 3;
ü Interfaces opcionais;
ü Para os casos excepcionais BeanLocator.
Composite Entity
Problema
ü A persistência com CMP 2.1 não
   suporta relacionamentos muito bem;
Solução                  Obsoleto
ü JPA
ü Entidades JPA orientadas a objeto.
Value Object Assembler
Problema
ü Montagem de DTOs
Solução
                      Obsoleto
ü JPA + EJB 3.
Business Delegate
Problema
ü 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.
Value list Handle
Problema
ü Paginação de EJB 2
Solução
ü JPA + EJB 3
                        Obsoleto
ü Desde a introdução do JPA as
   entidades podem ser facilmente
   desacopladas sem esforço adicional.
Arquiteturas JavaEE Enxutas

“Soluções pragmáticas ao invés de
  infinitas indireções, frameworks,
  camadas, e padrões.”
-- Adam Bien
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 objetos
interface do    com estado e
    serviço    comportamento

 Tende a ser     tende a ser
   stateless       stateful
Entity Control Boundary Pattern
             Service




   Service      Valido    Persistente
 Facade ou
  Gateway                Data Object
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.org




A primeira rede social sobre arquitetura de software do Brasil.

Repensando padrões e boas práticas java ee

  • 1.
    Repensando padrões e boaspráticas Java EE Adriano Tavares adriano.tavares@arkhi.com.br 20 de Outubro, 2012
  • 3.
    Palestrante ü Adriano de PinhoTavares; ü Arquiteto de Software na Arkhi; ü Certificações relevantes; –  SCJP, SCEA, IBMOOAD, IBMRUP, IBMSOA; ü Blog: http://adrianotavares.com
  • 4.
    Motivação ...evitar Repensar os padrões padrões obsoletos JavaEE... J2EE... ...criar ... foco no arquiteturas container enxutas server-side... JavaEE.
  • 5.
    Tópicos ü Breve história doJ2EE; ü 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.
  • 6.
    Breve história doJ2EE 1995: Applets 1996: Servlets 1997: EJB 1998: JMS 1999: J2EE 1.2, Nasce a plataforma J2EE 2001: J2EE 1.3, Core J2EE Patterns 2003: J2EE 1.4
  • 7.
    EJB 2 Stateless publicclass 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!"); } }
  • 8.
    EJB 2 Interfaces publicinterface 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(); }
  • 9.
    EJB 2 XMLDeployment 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>
  • 10.
    Maior equívoco doEJB 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.
  • 11.
    Core J2EE Patterns ü Mesmopara 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.
  • 12.
  • 13.
    EJB 2: Modelode programação Pesado
  • 14.
    Mesmo pesado, porqueo 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...
  • 15.
  • 16.
    A Evolução parao Java EE Leve Portável Extensível Alto-Desempenho Simples Fácil de desenvolver.
  • 17.
    ...do J2EE parao Java EE! 2006: Java EE 5 novo modelo de programação 2009: Java EE 6 simples, enxuto e leve. 2012: Java EE 7 Q4 Cloud computing
  • 18.
    Java EE: XMLvai pro banco... ...entra Annotation!
  • 19.
    Java EE, princípios Conventionover Configuration • XML opcional; Aspect-Oriented Programming • Pontos de extenção; Context and Dependency Injection • Código limpo.
  • 20.
    EJB 3 SessionBean @Stateless public class HelloWorldBean { public String sayHello(String name) { return "Hello from: ” + name; } }
  • 21.
    CDI ü  Ao invéscó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: @EJB private Service service;
  • 22.
    Injeção de EJBs @Stateless publicclass HelloWorldBean { @EJB private Service service; public String sayHello(String id) { return "Hello ” + service.getName(id); } }
  • 23.
    Uso da anotação@EJB Servlet JSP JSF Java Client JAX-WS JAX-RS (Main Class) EJB
  • 24.
    EJB 3 comJPA @Stateless public class BookServiceBean { @PersistenceContext private EntityManager em; public void create(Book book) { em.persist(book); } }
  • 25.
    EJB 3 Transações @Stateless @TransactionAttribute( TransactionAttributeType.MANDATORY) public class BookServiceBean { @PersistenceContext private EntityManager em; public void create(Book book) { em.persist(book); } }
  • 26.
    Injeção de outrosRecursos @Stateless public 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 } }
  • 27.
  • 28.
    Core J2EE patternshoje ü Continuam populares; ü Alguns padrões validos, outros opcionais, outros obsoletos; ü Problemas resolvidos no JavaEE.
  • 29.
    Real World JavaEE Patterns (2009) (2012)
  • 30.
    DAO + DTO:Dead or Alive? Problema ü Encapsular Persistência com EJB 2; Solução Obsoleto ü DRY! ü JPA + EJB 3.
  • 31.
    Service Locator Problema ü Encapsular LookupJNDI para acessar EJB ou outros recursos; Solução ü DRY! Opcional ü CDI + EJB 3; ü Interfaces opcionais; ü Para os casos excepcionais BeanLocator.
  • 32.
    Composite Entity Problema ü A persistênciacom CMP 2.1 não suporta relacionamentos muito bem; Solução Obsoleto ü JPA ü Entidades JPA orientadas a objeto.
  • 33.
    Value Object Assembler Problema ü Montagemde DTOs Solução Obsoleto ü JPA + EJB 3.
  • 34.
    Business Delegate Problema ü O clienteEJB 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.
  • 35.
    Value list Handle Problema ü Paginaçãode EJB 2 Solução ü JPA + EJB 3 Obsoleto ü Desde a introdução do JPA as entidades podem ser facilmente desacopladas sem esforço adicional.
  • 36.
    Arquiteturas JavaEE Enxutas “Soluçõespragmáticas ao invés de infinitas indireções, frameworks, camadas, e padrões.” -- Adam Bien
  • 37.
    Forma leve dedesenhar aplicações Entity, objetos persistentes Control, lógicas de negócio Boundary, interfaces.
  • 38.
    Diferença de abordagem SOA DDD Foco na Foco em objetos interface do com estado e serviço comportamento Tende a ser tende a ser stateless stateful
  • 39.
    Entity Control BoundaryPattern Service Service Valido Persistente Facade ou Gateway Data Object
  • 40.
    DEMO ü Aplicação Finace –  Java EE 6; ü  EJB 3 ü  JPA ü  JSF ü  Prime Faces –  Netbeans 7.2; –  Java DB.
  • 41.
  • 43.
    Participe da redePangea http://pangeanet.org A primeira rede social sobre arquitetura de software do Brasil.