Le temps est révolu où Java EE ne serait qu’à développer des applications de mise à jour de données, avec JSF / EJB / JPA. Aujourd’hui Java EE s’est assoupli et s’est ouvert sur le monde, avec CDI comme clé de voûte et a repoussé nos limites grâce à des capacités d’extension puissantes et faciles d’utilisation comme JCA.
Dans un premier temps, nous reviendrons rapidement sur la place de CDI dans JavaEE 7 et sur ses mécanismes d’extension. Dans un deuxième temps, nous verrons les techniques de connecteurs JCA et comment ils peuvent aussi constituer une possibilité d’ouverture simple à mettre en œuvre. JCA fournit des techniques pour gérer des connexions sortantes ou entrantes, sur des formats ou protocoles variés.
30. Context & Dependency Injection
• IoC pour Java EE et Java SE
• Gestion des contextes
• Liant pour la plupart des spec Java EE
• Moteur d’extensions pour Java EE
36. Qualifiers
public class FrenchMessageService
implements MessageService {
public String message() {
return "Bonjour le monde !";
}
}
public class EnglishMessageService
implements MessageService {
public String message() {
return "Hello World!";
}
}
37. Qualifiers
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface French {}
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface English {}
38. Qualifiers
@French
public class FrenchMessageService
implements MessageService {
public String message() {
return "Bonjour le monde !";
}
}
@English
public class EnglishMessageService
implements MessageService {
public String message() {
return "Hello World!";
}
}
39. Qualifiers
public class HelloBean {
@Inject @French MessageService service;
public void displayHello() {
display(service.message());
}
}
41. Programmatic lookup
public class HelloBean {
@Inject Instance<MessageService> service;
public void displayHello() {
if (! service.isUnsatisfied()) {
display(service.get().message());
}
}
}
42. Programmatic lookup
public class HelloBean {
@Inject @Any
Instance<MessageService> services;
public void displayHello() {
for (MessageService service : services) {
display(service.message());
}
}
}
57. Bean Manager
• Interagir avec le conteneur CDI
• Lecture seule
• Injectable
• JNDI
• java:comp/BeanManager
public class HelloBean {
@Inject BeanManager beanManager;
...
}
58. Extension
• Manipuler les métadonnées du container
• AnnotatedType
• InjectionPoint / InjectionTarget
• BeanAttributes / Beans
• Producer, Observer
• Pendant le démarrage
59. Comment ?
En observant les
événements
déclenchés par le
conteneur CDI
60. Exemple (-)
• Exclure les entités JPA
public class VetoEntityExtension
implements Extension {
public void vetoEntity(
@Observes @WithAnnotations({Entity.class})
ProcessAnnotatedType<?> pat) {
pat.veto();
}
}
61. Exemple (+)
• Ajouter un bean
public class HashMapAsBeanExtension
implements Extension {
public void addHashMapAsAnnotatedType(
@Observes BeforeBeanDiscovery bbd,
BeanManager beanManager) {
bbd.addAnnotatedType(
beanManager.createAnnotatedType(HashMap.class)
);
}
}
62. CDI 1.1 Lifecycle
Before Bean
Discovery
Process Bean
Scan
Archive
Process
Annotated
Type
After
Deployment
Validation
Application
Running
Before
Shutdown
Undeploy
Application
After Bean
Discovery
Process
Producer
Process
Injection
Target
Process
Observer
Method
Process
Injection
Point
Process Bean
Attributes
After Type
Discovery
événement unique
événements multiples
étape interne
Deployment
starts
Bean
eligibility
check