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.

samedi 2 janvier 2010

Sortie de Spring 3.0

Les nouveautées
La version 3.0 GA (.RELEASE) du framework Spring vient de sortir, au menu voici quelques unes des nouveautés les plus importantes (ces indications proviennent principalement du blog http://blog.springsource.com/2009/12/16/spring-framework-3-0-goes-ga) :
  • Un réécriture complète du framework en tirant partie des spécificités de Java 5, notamment les generics et listes d'arguments variables (varargs).
  • Un support partiel de Java EE 6 (JSR-316) en terme d'environnement d'exécution mais aussi le support de la nouvelle version de JPA 2.0 (JSR-220), un support de l'annotation @ManagedBean (JSR-250) pour le scanning des composants et le support des annotations @Inject, @Named, @Qualifier et de l'interface Provider (JSR-330) pour l'injection de dépendances.
  •  L'arrivée d'un nouveau langage d'expression à utiliser dans les fichiers de configuration XML Spring ou dans les annotations. Spring Expression Language (SpEL).
  • L'apparition des annotation @Configuration et @Bean, héritages de JavaConfig.
  • L'apparition d'une nouvelle annotation @Value qui permet l'injection de valeurs de configuration statiques ou dynamiques.
  • Possibilité de créer rapidement des annotations raccourcies, par exemple créer une seule annotation qui va en remplacer plusieurs.
  • Un modèle déclaratif de validation à base d'annotations qui reprend les principe de l'API Hibernate Validator 4.0. (JSR-303).
  • Un support amélioré du binding et de la validation dans Spring MVC, le formatage peut être supporté via des annotations d'une manière similaire à la JSR-303.
  • Support de REST, utilisation facilitée dans Spring MVC, une classe RestTemplate pour faciliter la création de clients REST.
  • Support complet des portlets 2.0.
  • Le mapping Objet / XML (OXM), héritage de Spring Web Services.
  • De nouvelles fonctionnalités pour la planification de tâches.
  • Une documentation améliorée.
Ici je n'ai fais qu'un tour rapide des nouvelles fonctionnalités de Spring 3.0, j'en ai sans doute oublié certaines donc n'hésitez pas à poster !
    Liens relatifs à la sortie de Spring 3.0
    http://www.springsource.org/node/2271
    http://www.theserverside.com/news/thread.tss?thread_id=58985

    Téléchargement du framework
    http://www.springsource.com/products/spring-community-download

    Documentation
    HTML (plusieurs pages) : http://static.springsource.org/spring/docs/3.0.x/reference/html/
    HTML (une seule page) : http://static.springsource.org/spring/docs/3.0.x/reference/htmlsingle/spring-framework-reference.html
    PDF : http://static.springsource.org/spring/docs/3.0.x/reference/pdf/spring-framework-reference.pdf