Observer • Un ‘producteur’ d’évènements • Un ou plusieurs consommateurs • Sélection des cibles grâce aux types d’évènements et aux qualifiers •Système synchrone !!!
d’étendre Java EE de façon standard • API d’extension permettant de : • Ajouter/Supprimer des beans • Ajouter un scope • Modifier les méta-données d’un bean • Remplir des points d’injection • etc ...
l’interface (vide) Extension • Observer les évènements provenant du conteneur pour modifier le déploiement • Enregistrer l’extension • Ajouter un fichier META-INF/services/ javax.enterprise.inject.spi.Extension contenant le nom complet de la classe d’extension Comment ça marche ?
CDI 1.1 (construit en parallèle de la spec.) • Projet plutôt mature • Utilisé dans plusieurs serveurs d’applications • Bonne communauté, réactive • Gros travail d’évangélisation JBoss
les efforts autour des extensions CDI • JBoss Seam 3 • MyFaces CODI • CDISource • Créer un standard de-facto maintenu par la communauté Java • Environnement de test basé sur Arquillian
• RequestParam, Context, Cookies, Cookie-params, Principal • Ajout de quelques filtres et listeners dans le web.xml si • Pas de configuration si environnement servlet 3.0 • Events bridge • Servlet lifecycle, etc ...
tête • Le meilleur des deux mondes • dynamique, typesafe, annotations, etc ... • Extension CDI pour utiliser le modèle de programmation CDI dans un environnement OSGi • Développé par l’équipe R&D de SERLI • A la demande de l’équipe JBoss Weld • Faire disparaitre le modèle de programmation OSGi au profit du standard CDI (mais compatible) • Pas besoin de connaître OSGi
bundleContext courant • Injection des/d’une méta-données courantes • Injection des fichiers spécifiques au bundle (dans le conteneur) • Autres utilitaires au fur et à mesure
Map<String, String> headers; @Inject @BundleHeader("Bundle-SymbolicName") String symbolicName; @Inject @BundleDataFile("text.txt") File text; • Injection du bundle courant • Injection du bundleContext courant • Injection des/d’une méta-données courantes • Injection des fichiers spécifiques au bundle (dans le conteneur) • Autres utilitaires au fur et à mesure
service; service.doSomething(); // échoue si pas de service disponible @Inject @OSGiService MyService service; P R O X Y Provider InjectionPoint create() get()
Service<MyService> service; for (MyService actualService : service.first()) { actualService.doSomething(); // appelé sur 0-1 service } for (MyService actualService : service) { actualService.doSomething(); // appelé sur 0-n service(s) } service.get().doSomething(); // peut échouer, non dynamique service.size(); service.isUnsatisfied(); service.isAmbiguous();
Service<MyService> service; for (MyService actualService : service.first()) { actualService.doSomething(); // appelé sur 0-1 service } for (MyService actualService : service) { actualService.doSomething(); // appelé sur 0-n service(s) } service.get().doSomething(); // peut échouer, non dynamique service.size(); service.isUnsatisfied(); service.isAmbiguous();
public void start( @Observes Valid evt) {} public void stop( OSGi service registry listener services events required service registration dependencies validation events Bean B Bean A
evt) { System.out.println("service is available"); service.get().doSomething(); } public void stop(@Observes Invalid evt) { System.out.println("service is unavailable"); } bundle complet
CDI depuis des clients GWT • Invocations RPC • Publish/Subscribe • CDI events • Exposer les modèles métier aux clients GWT (@ExposeEntity) • Injection de dépendance côté client • http://www.jboss.org/errai
Weld) • Faire fonctionner CDI sur GAE • Quelques workaround pour contrer les APIs défendues • Accès aux API GAE via CDI • Utiliser les API GAE sur JBoss AS 7 • Permettre de switcher entre AS7 et GAE de manière transparente
Bootstrap de context Spring (SE et Web) • Utilisation de beans Spring depuis CDI • Utilisation de beans CDI depuis Spring • Bridge Spring Security • Bridge CDI events • http://seamframework.org/Seam3/SpringModule
AS 7 • Support de Rack, Rails, Sinatra, etc ... • Interopérable avec les features Java EE • Transactions, JMS, Cache, Session, Jobs • CDI, Resources injection, Authentication
def index @rails_msg = "Hello from Rails!" end end def followers twitter = inject(com.foo.bar.TwitterClient) @twitter_followers = twitter.get_users end
def index @rails_msg = "Hello from Rails!" end end def search twitter = inject(com.foo.bar.TwitterClient) @twitter_search = twitter.get_search end def followers twitter = inject(com.foo.bar.TwitterClient) @twitter_followers = twitter.get_users end
nouvel environnement • Deux «parties» nécessaires • Bootstrap du container et déploiement des classes/beans • Spécifique à l’implémentation • Devrait être standardisé • Extension CDI • Lien avec l’environnement (uni/bi-directionnel)
embarquable et lookup externe • TODO : boot, bean deployment • Ordre des intercepteurs • ProcessModule, ProcessInjectionPoint • Exclusion déclarative des beans • Service handlers • Lifecycle events • Injection statique et des enums