dimanche 24 janvier 2010

Spring 3.0, @ManagedBean, @Named, @Inject, @Qualifier, Provider (JSR-330)

Dans un de mes précédents articles (http://bgaillard.blogspot.com/2010/01/sortie-de-spring-30.html) je parlais de la sortie de Spring 3.0, notamment du support partiel de la JSR-330.

Je vois dans cette JSR un premier pas vers la standardisation d'annotations Java pour l'injection de dépendances. Je détaillerai ici le fonctionnement des annotations @Inject, @Named et @Qualifier ainsi que l'interface Provider de la JSR-330. L'objectif, au final, étant de disposer d'un code compatible avec Java EE 6 j'expliquerai aussi le fonctionnement de l'annotation @ManagedBean.

Les annotations @Scope et @Singleton n'étant actuellement pas supportées par Spring 3.0 je ne les détaillerai pas dans cet article, elle feront l'objet d'un prochain article relatif à Guice

La compréhension de cet article nécessite une connaissance minimum de Spring (1, 2 ou 3) et de l'injection de dépendance. Si vous ne connaissez pas encore l'injection de dépendances (IoC pour Inversion Of Control ou DI pour Dependency Injection) le meilleur article que je puisse vous conseiller est celui de Martin Fowler situé à cette adresse: http://martinfowler.com/articles/injection.html.  

@ManagedBean
La JSR-316 défini les Managed Beans comme étant des objets gérés par un conteneur, ces objets doivent remplir un certains nombre de pré requis. Dans le cas de Spring le conteneur est évidemment le conteneur d'inversion de contrôle du framework. Les Managed Beans supportent un ensemble de services basiques tels que l'injections de ressources, des intercepteurs (JSR-316, Interceptors 1.1) et des fonctions de callback branchées sur certaines phases du cycle de vie des beans.

La spécification définie un modèle de composant basique pour les Managed Beans, ce modèle pourra être altéré dans d'autres spécifications ou certaines implémentations. Par exemple la spécification indique qu'un bean doit être déclaré via l'annotation @ManagedBean, avec Spring il est aussi possible de le faire via des instructions XML.

Voici un exemple de déclaration de Managed Bean.

@ManagedBean
  public class Bean {}

Ce qui est équivalent à la déclaration XML Spring suivante.


Un Managed Bean ne doit pas être une classe finale, abstraite ou une classe imbriquée non statique.

Par défaut le nom du bean dans le conteneur Spring sera le nom de la classe avec une lettre minuscule pour la première lettre. Il est possible de changer le nom du bean de cette manière.

@ManagedBean("autreNom")
  public class Bean {}

Deux fonctions de callback peuvent être définies.
  • @PostConstruct permet d'annoter une fonction qui sera appelée juste après la construction du Managed Bean.
  • @PreDestroy permet d'annoter une fonction qui sera appelée juste avant la destruction du Managed Bean.

Par exemple le code suivant:
@ManagedBean("autreNom")
  public class Bean {
    private Bean() {
      System.out.println("Construction...")
    }
 
    @PostConstruct
    private void postConstruct() {
      System.out.println("Post construction...");
    }
 
    @PreDestroy
    private void preDestroy() {
      System.out.println("Pre destruction...");
    }
  }

donnera la sortie suivante:
Construction...
Post construction...
Pre destruction...

Attention, si vous utilisez l'annotation @PreDestroy dans une application Java classique (non Web) la fonction suivante doit être appelée sur votre Application Context Spring.

((AbstractApplicationContext)applicationContext).registerShutdownHook();



JSRs: Managed Bean 1.0 Specification (JSR-316)
Javadoc:http://java.sun.com/javaee/6/docs/api/javax/annotation/ManagedBean.html
Package Java: javax.annotation
Dépendance Maven:

    glassfish-repository
    Java.net Repository for Glassfish
    http://download.java.net/maven/glassfish
  


    org.glassfish
    javax.annotation
    3.0
  

Téléchargement librairie: http://download.java.net/maven/glassfish/org/glassfish/javax.annotation/3.0/


@Inject

@Named

Provider


Cette article sera complété dans les prochains jours.

Aucun commentaire: