Conhecendo CDIDaniel Cunha (soro)[email protected] 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/[email protected]
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)[email protected] http://www.danielsoro.com.br
CDI 1.1 - JSR 346
Top Related