[java] contexts and dependency injection em jee6

28
CDI Contexts and Dependency Injection em JEE6 José Naves Moura Neto - [email protected] http://josenaves.com - @josenaves Código em https://github.com/josenaves/cdiDemo

Upload: jose-naves-moura-neto

Post on 11-Jun-2015

714 views

Category:

Technology


8 download

DESCRIPTION

Context and Dependecy Injection - CDI - uma introdução

TRANSCRIPT

Page 1: [Java] Contexts and Dependency Injection em JEE6

CDIContexts and Dependency Injection em JEE6José Naves Moura Neto - [email protected]://josenaves.com - @josenavesCódigo em https://github.com/josenaves/cdiDemo

Page 2: [Java] Contexts and Dependency Injection em JEE6

CDIO que é?

O que é?Especificação do mecanismo que gerencia ciclo de vida e dependências entre beans (servlets, EJBs, POJOs, JSF Managed Beans). Introduzido no JEE6 (JSR-299).

Page 3: [Java] Contexts and Dependency Injection em JEE6

CDIHabilitando

Para habilitar:Criar um arquivo beans.xml no diretório META-INF da aplicação.

Page 4: [Java] Contexts and Dependency Injection em JEE6

CDIFuncionamento

Como funciona:1. Durante o deploy, se o servidor de

aplicações encontrar o arquivo beans.xml, será criado um contexto CDI.

2. Todas as classes com anotações CDI (@Named - javax.inject.Named) serão registradas.

3. Estes beans serão instanciados e injetados de acordo com suas dependências

Page 5: [Java] Contexts and Dependency Injection em JEE6

CDI@Named

javax.inject.Named

Page 6: [Java] Contexts and Dependency Injection em JEE6

CDI@Named

Registra uma classe no container CDI. Instâncias serão criadas para cada anotação @Injected encontrada.

@Named

public class ClientService {

...

}

Page 7: [Java] Contexts and Dependency Injection em JEE6

CDI@Inject

javax.inject.Inject

Page 8: [Java] Contexts and Dependency Injection em JEE6

CDI@Inject

Assinala o container CDI a gerar novas instâncias da classe anotada para injetar no campo, construtor ou setter.

public class Client {

@Inject private ClientService clientService;

private Account accout;// public Client(@Inject Account account) { this.account = account; }

public void setAccount(@Inject Account account) {

this.account = account;

}

}

Page 9: [Java] Contexts and Dependency Injection em JEE6

CDI@Qualifier

javax.inject.Qualifier

Page 10: [Java] Contexts and Dependency Injection em JEE6

CDI@Qualifier

Anotação usada para criar uma anotações que serão usadas para diferenciar um tipo de outro.

@Qualifierpublic @interface PreferedDao{}

@PreferedDaopublic class OracleDao implements Dao { ... }

public class MongoDao implements Dao { ... }

public class MyService { @PreferedDao @Injected private dao; }

Page 11: [Java] Contexts and Dependency Injection em JEE6

CDI@Alternative

javax.enterprise.Alternative

Page 12: [Java] Contexts and Dependency Injection em JEE6

CDI@Alternative

Desabilita classes de serem injetadas e evita problemas de ambiguidades durante o deployment.

A classe a ser utilizada para injeção deve ser marcada no arquivo beans.xml (tag <alternatives>).

Page 13: [Java] Contexts and Dependency Injection em JEE6

CDI@PostConstruct

javax.annotation.PostConstruct

Page 14: [Java] Contexts and Dependency Injection em JEE6

CDI@PostConstruct

Anota um método que será chamado pelo container quando o bean for instanciado e todas suas dependências forem injetadas.public class ClientService {

@PostConstruct private void init() {// abre conexão TCP com Mainframe

logger.info("ClientService operacional");

}

}

Page 15: [Java] Contexts and Dependency Injection em JEE6

CDI@PreDestroy

javax.annotation.PreDestroy

Page 16: [Java] Contexts and Dependency Injection em JEE6

CDI@PreDestroy

Anota um método que será chamado pelo container quando o bean estiver no ponto de ser descartado.public class ClientService {

...@PreDestroy private void destroy() {

// fecha conexão TCP com Mainframe

logger.info("ClientService desativado.");

}

}

Page 17: [Java] Contexts and Dependency Injection em JEE6

CDI@Observes

javax.enterprise.event.Observes

Page 18: [Java] Contexts and Dependency Injection em JEE6

CDI@Observes

POJOs agora podem produzir e consumir eventos.

Definindo um eventopublic class Auth {

@Inject Event<Login> loginEvent; ...

public void auth() {

...

if (success) {

loginEvent.fire(login); }

}

}

Page 19: [Java] Contexts and Dependency Injection em JEE6

CDI@Observes

Tratando um evento

public class Monitor {

...

public void onLogin( @Observes Login login) {// grava em arquivo de log o login bem sucedido

logger.info("Usuario " + login.username + " entrou no sistema.");

}

}

Page 20: [Java] Contexts and Dependency Injection em JEE6

CDI@Interceptor

javax.interceptor.Interceptor

Page 21: [Java] Contexts and Dependency Injection em JEE6

CDI@Interceptor

JEE também traz suporte a Interceptors para POJOs.

Para usar, é necessário criar uma anotação com @InterceptorBinding. @InterceptorBinding@Target ({TYPE, METHOD}) @Retention(RUNTIME)public @interface Log{}

Dessa maneira, toda classe que tiver a anotação @Log será interceptada.

Page 22: [Java] Contexts and Dependency Injection em JEE6

CDI@Interceptor

Depois, é necessário fazer a implementação do interceptor propriamente dito.@Interceptor@Logpublic class LogInterceptor {

@AroundInvokepublic Object logMethod(InvocationContext ctx) throws Exception {

logger.info("Entrando no método:" + ctx.getMethod().getName());

return ctx.proceed();

}

}

Page 23: [Java] Contexts and Dependency Injection em JEE6

CDI@Interceptor

É necessário também habilitar o interceptor no arquivo beans.xml.

<beans>

<interceptors>

<class>br.com.oi.interceptor.LogInterceptor</class>

</interceptors>

</beans>

Podemos ter vários interceptors ativos no projeto. A ordem em que os interceptors são definidos é importante!

Page 24: [Java] Contexts and Dependency Injection em JEE6

CDI@Interceptor

Pronto! Agora toda classe que estiver anotada com @Log, logará a chamada do método automaticamente.

@Logpublic class QueroLogar {

public void metodo() {

System.out.println("Teste");}

}

Page 25: [Java] Contexts and Dependency Injection em JEE6

CDIPrincipais anotações

Resumindo:@Named@Inject@Qualifier@Alternative@PostConstruct@PreDestroy@Observes@Interceptor

Page 26: [Java] Contexts and Dependency Injection em JEE6

CDIRecursos

● Java EE Managed Bean Specificationhttp://jcp.org/en/jsr/detail?id=316

● Série de tutoriais JEE2 CDI de Andy Gibson no site do Netbeans http://netbeans.org/kb/docs/javaee/cdi-intro.html

● Weld - implementação de referência da especificação JSR-299http://sfwk.org/Weld

Page 28: [Java] Contexts and Dependency Injection em JEE6

CDIThe End