Repensando padrões e boas práticas java ee

43
Repensando padrões e boas práticas Java EE Adriano Tavares [email protected] 20 de Outubro, 2012

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 of Repensando padrões e boas práticas java ee

Page 1: Repensando padrões e boas práticas java ee

Repensando padrões e boas práticas Java EE

Adriano Tavares [email protected]

20 de Outubro, 2012

Page 2: Repensando padrões e boas práticas java ee
Page 3: 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

Page 4: Repensando padrões e boas práticas java ee

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

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

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

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

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

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

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

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

Core J2EE Patterns

(2001) (2003)

Page 13: Repensando padrões e boas práticas java ee

EJB 2: Modelo de programação Pesado

Page 14: Repensando padrões e boas práticas java ee

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

Frameworks Nightmare

Page 16: Repensando padrões e boas práticas java ee

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

...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

Java EE: XML vai pro banco... ...entra Annotation!

Page 19: Repensando padrões e boas práticas java ee

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

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

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

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

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

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

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

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

Repensando padrões Java EE

Page 28: Repensando padrões e boas práticas java ee

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

Real World Java EE Patterns

(2009) (2012)

Page 30: Repensando padrões e boas práticas java ee

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

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

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

Value Object Assembler

Problema ü Montagem de DTOs Solução ü JPA + EJB 3. Obsoleto

Page 34: Repensando padrões e boas práticas java ee

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

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

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

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

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

Entity Control Boundary Pattern

Service Facade ou Gateway

Service

Persistente Data Object

Valido

Page 40: Repensando padrões e boas práticas java ee

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

Conclusão e Perguntas

Page 42: Repensando padrões e boas práticas java ee
Page 43: Repensando padrões e boas práticas java ee

Participe da rede Pangea http://pangeanet.org

A primeira rede social sobre arquitetura de software do Brasil.