Repensando padrões e boas práticas java ee
-
Upload
adriano-tavares -
Category
Technology
-
view
4.038 -
download
0
description
Transcript of Repensando padrões e boas práticas java ee
Palestrante
ü Adriano de Pinho Tavares; ü Arquiteto de Software na Arkhi;
ü Certificações relevantes; – SCJP, SCEA, IBMOOAD, IBMRUP, IBMSOA;
ü Blog: http://adrianotavares.com
Motivação
Repensar os padrões JavaEE...
...evitar padrões
obsoletos J2EE...
... foco no container
server-side...
...criar arquiteturas
enxutas 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
JAX-WS Java Client (Main Class) JAX-RS
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 ü DRY! ü JPA + EJB 3.
Obsoleto
Service Locator
Problema ü Encapsular Lookup JNDI para acessar EJB
ou outros recursos; Solução ü DRY! ü CDI + EJB 3; ü Interfaces opcionais; ü Para os casos excepcionais BeanLocator.
Opcional
Composite Entity
Problema ü A persistência com CMP 2.1 não
suporta relacionamentos muito bem; Solução ü JPA ü Entidades JPA orientadas a objeto.
Obsoleto
Value Object Assembler
Problema ü Montagem de DTOs Solução ü JPA + EJB 3. Obsoleto
Business Delegate
Problema ü O cliente EJB tinha que capturar, ou
pelo menos esconder, as exceções de EJB 2;
Solução ü CDI + EJB 3; ü As exceções de EJB 2 foram
convertidos para exceções do sistema.
Obsoleto
Value list Handle
Problema ü Paginação de EJB 2 Solução ü JPA + EJB 3 ü Desde a introdução do JPA as
entidades podem ser facilmente desacopladas sem esforço adicional.
Obsoleto
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 Foco na
interface do serviço
Tende a ser stateless
DDD Foco em objetos
com estado e comportamento
tende a ser stateful
Entity Control Boundary Pattern
Service Facade ou Gateway
Service
Persistente Data Object
Valido
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.