repensando padrões e boas práticas java ee
DESCRIPTION
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.TRANSCRIPT
![Page 2: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/2.jpg)
![Page 3: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/3.jpg)
Palestrante
ü Adriano de Pinho Tavares; ü Arquiteto de Software na Arkhi;
ü Certificações relevantes; – SCJP, SCEA, IBMOOAD, IBMRUP, IBMSOA;
ü Blog: http://adrianotavares.com
![Page 4: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/4.jpg)
Motivação
Repensar os padrões JavaEE...
...evitar padrões
obsoletos J2EE...
... foco no container
server-side...
...criar arquiteturas
enxutas JavaEE.
![Page 5: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/5.jpg)
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.
![Page 6: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/6.jpg)
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
![Page 7: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/7.jpg)
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!"); }
}
![Page 8: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/8.jpg)
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();
}
![Page 9: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/9.jpg)
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>
![Page 10: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/10.jpg)
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.
![Page 11: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/11.jpg)
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.
![Page 12: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/12.jpg)
Core J2EE Patterns
(2001) (2003)
![Page 13: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/13.jpg)
EJB 2: Modelo de programação Pesado
![Page 14: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/14.jpg)
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...
![Page 15: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/15.jpg)
Frameworks Nightmare
![Page 16: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/16.jpg)
A Evolução para o Java EE Leve
Portável Extensível
Alto-Desempenho Simples
Fácil de desenvolver.
![Page 17: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/17.jpg)
...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
![Page 18: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/18.jpg)
Java EE: XML vai pro banco... ...entra Annotation!
![Page 19: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/19.jpg)
Java EE, princípios
Convention over Configuration • XML opcional;
Aspect-Oriented Programming • Pontos de extenção;
Context and Dependency Injection • Código limpo.
![Page 20: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/20.jpg)
EJB 3 Session Bean
@Stateless public class HelloWorldBean {
public String sayHello(String name) { return "Hello from: ” + name;
}
}
![Page 21: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/21.jpg)
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;
![Page 22: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/22.jpg)
Injeção de EJBs @Stateless public class HelloWorldBean {
@EJB private Service service;
public String sayHello(String id) { return "Hello ” + service.getName(id);
}
}
![Page 23: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/23.jpg)
Uso da anotação @EJB
Servlet JSP JSF
JAX-WS Java Client (Main Class) JAX-RS
EJB
![Page 24: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/24.jpg)
EJB 3 com JPA
@Stateless public class BookServiceBean {
@PersistenceContext private EntityManager em;
public void create(Book book) {
em.persist(book); }
}
![Page 25: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/25.jpg)
EJB 3 Transações @Stateless
@TransactionAttribute( TransactionAttributeType.MANDATORY) public class BookServiceBean {
@PersistenceContext
private EntityManager em;
public void create(Book book) {
em.persist(book);
}
}
![Page 26: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/26.jpg)
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
}
}
![Page 27: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/27.jpg)
Repensando padrões Java EE
![Page 28: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/28.jpg)
Core J2EE patterns hoje
ü Continuam populares;
ü Alguns padrões validos, outros opcionais, outros obsoletos;
ü Problemas resolvidos no JavaEE.
![Page 29: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/29.jpg)
Real World Java EE Patterns
(2009) (2012)
![Page 30: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/30.jpg)
DAO + DTO: Dead or Alive?
Problema ü Encapsular
Persistência com EJB 2;
Solução ü DRY! ü JPA + EJB 3.
Obsoleto
![Page 31: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/31.jpg)
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
![Page 32: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/32.jpg)
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
![Page 33: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/33.jpg)
Value Object Assembler
Problema ü Montagem de DTOs Solução ü JPA + EJB 3. Obsoleto
![Page 34: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/34.jpg)
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
![Page 35: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/35.jpg)
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
![Page 36: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/36.jpg)
Arquiteturas JavaEE Enxutas
“Soluções pragmáticas ao invés de infinitas indireções, frameworks, camadas, e padrões.” -- Adam Bien
![Page 37: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/37.jpg)
Forma leve de desenhar aplicações
Entity, objetos persistentes Control, lógicas de negócio Boundary, interfaces.
![Page 38: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/38.jpg)
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
![Page 39: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/39.jpg)
Entity Control Boundary Pattern
Service Facade ou Gateway
Service
Persistente Data Object
Valido
![Page 40: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/40.jpg)
DEMO
ü Aplicação Finace – Java EE 6;
ü EJB 3 ü JPA ü JSF ü Prime Faces
– Netbeans 7.2; – Java DB.
![Page 41: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/41.jpg)
Conclusão e Perguntas
![Page 42: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/42.jpg)
![Page 43: Repensando padrões e boas práticas java ee](https://reader034.vdocuments.com.br/reader034/viewer/2022050808/557def1fd8b42ac4128b5173/html5/thumbnails/43.jpg)
Participe da rede Pangea http://pangeanet.org
A primeira rede social sobre arquitetura de software do Brasil.