Conhecendo CDI

Post on 08-May-2015

841 views 2 download

Transcript of Conhecendo CDI

Conhecendo CDIDaniel Cunha (soro)danielsoro@gmail.com http://www.danielsoro.com.br

CDI 1.1 - JSR 346

Daniel Cunha

soro - irc.freenode.nethttp://danielsoro.com.br

http://github.com/danielsorohttp://twitter.com/dvlc_danielsoro@gmail.com

O que é e pra que serve o CDI?

Iniciando com CDI

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" version="1.1" bean-discovery-mode="all"></beans>

beans.xml

Injetando suas dependências

@

Inject

E quando eu tenho mais de uma

implementação?

Qualifiers

Alternatives

Alternatives<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" version="1.1" bean-discovery-mode="all"> <alternatives> <class>package.RelaxedItemValdidator</class> </alternatives></beans>

@

PriorityInterceptor.Priority.PLATFORM_BEFORE = 0Interceptor.Priority.LIBRARY_BEFORE = 1000Interceptor.Priority.APPLICATION = 2000Interceptor.Priority.LIBRARY_AFTER = 3000Interceptor.Priority.PLATFORM_AFTER = 4000

E quando eu quiser dar nome ao meu

bean?

@Inject @Named("user.name") private String userName;

E quando eu quiser evoluir o meu bean?

@Specializespublic class ClasseFilha extends ClasseMae {}

@Specializes @Cejugpublic class ClasseFilha extends ClasseMae {}

@RequestScope @Ivia @Named(“mae”)public class ClasseMae

@Specializes @Cejug public class ClasseFilha extends ClasseMae {}

@RequestScope @Ivia @Named(“mae”)public class ClasseMae

@Specializes @Cejug @Named(“filha”)public class ClasseFilha extends ClasseMae {}

Tenho outra forma de evitar ambiguidade?

@Typed({Cejug.class,GUJavaSC.class})public class BrazilJugs extends Jugs {}

E quando eu quiser injetar uma classe que não é um bean CDI?

import javax.enterprise.inject.Produces;public class Produtor {

@Producespublic Logger criarLogger(){

return LoggerFactory.getLogger(ConhecendoCDI.class);}

}

E quando eu quiser finalizar esse bean?

import javax.enterprise.inject.Disposes;public class Produtor {@Produces @CejugDB

public EntityManager criaEntityManager(){EntityManagerFactory emf = Persistence.

createEntityManagerFactory("cejugdb");return emf.createEntityManager();

}

public void fechaEntityManager(@Dispose @CejugDB EntityManager em){

em.close();}

}

Criações mais flexiveis

import javax.enterprise.inject.Produces;public class Produtor {

@Producespublic Logger criarLogger(InjectPoint injectPoint){

return LoggerFactory.getLogger(injectPoint.getMember().getDeclaringClass().getName());

}}

Escopos CDI

@RequestScoped@SessionScoped@ApplicationScoped@ConversationScoped@Dependent

Quero interceptar.. Como eu faço?

@Interceptor @Priority(Interceptor.Priority.APPLICATION)public class Auditor {}

Posso escolher quem interceptar?

@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE, ElementType.METHOD})@InterceptorBindingpublic @interface Auditavel {}

@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE, ElementType.METHOD})@Inherited@InterceptorBindingpublic @interface Auditavel {}

Interceptando o ciclo de vida

@AroundConstruct@PostConstruct@PreDestroy

Decorando o nosso bean

@Decoratorpublic abstract class CoderDecorator implements Coder { @Inject @Delegate @Any Coder coder; public String codeString(String s, int tval) { int len = s.length(); return coder.codeString(s, tval); }}

Decorator<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" version="1.1" bean-discovery-mode="all"> <decorators> <class>decorators.CoderDecorator</class> </decorators></beans>

Preciso replicar as 30 annotation da classe X na Y… e agora?

@Stereotype

import javax.enterprise.inject.Stereotype;

@Stereotype@Named @RequestScoped@Auditavel @Rastreavel@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface CejugStereotype {}

Diminuindo acoplamento

@Injectprivate Event<Palestrante> eventoCejug;

eventoCejug.fire(palestrante);

public void adicionarPalestrante(@Observes Palestrante palestrante){}

E eu posso fazer chamadas assíncronas?

@Asynchronouspublic void adicionarPalestrante(@Observes Palestrante palestrante){}

Dúvidas?

Obrigado

Conhecendo CDIDaniel Cunha (soro)danielsoro@gmail.com http://www.danielsoro.com.br

CDI 1.1 - JSR 346