Interfaces BeanNameAware et BeanFactoryAware au printemps

1. Vue d’ensemble

Dans ce rapide tutoriel, nous allons nous concentrer sur les interfaces BeanNameAware et BeanFactoryAware , dans Spring Framework .

Nous décrirons chaque interface séparément avec les avantages et les inconvénients de leur utilisation.

2. Aware Interface

BeanNameAware et BeanFactoryAware appartiennent tous deux à l’interface de marqueur racine org.springframework.beans.factory.Aware .

Ceci utilise l’injection de setter pour obtenir un objet lors du démarrage du contexte d’application.

  • L’interface Aware est un mélange de modèles de conception de rappel, d’écoute et d’observateur ** . Il indique que le haricot est éligible pour être averti par le conteneur Spring via les méthodes de rappel.

3. BeanNameAware

  • BeanNameAware permet à l’objet de connaître le nom du bean défini dans le conteneur ** .

Regardons un exemple:

public class MyBeanName implements BeanNameAware {

    @Override
    public void setBeanName(String beanName) {
        System.out.println(beanName);
    }
}

La propriété beanName représente l’ID de bean enregistré dans le conteneur Spring. Dans notre implémentation, nous affichons simplement le nom du bean.

Ensuite, enregistrons un bean de ce type dans une classe de configuration Spring:

@Configuration
public class Config {

    @Bean(name = "myCustomBeanName")
    public MyBeanName getMyBeanName() {
        return new MyBeanName();
    }
}

Ici, nous avons explicitement assigné un nom à notre classe MyBeanName avec la ligne @ Bean (name = “myCustomBeanName”) .

Nous pouvons maintenant démarrer le contexte de l’application et en extraire le haricot:

AnnotationConfigApplicationContext context
  = new AnnotationConfigApplicationContext(Config.class);

MyBeanName myBeanName = context.getBean(MyBeanName.class);

Comme on pouvait s’y attendre, la méthode setBeanName imprime «myCustomBeanName» .

Si nous supprimons le code name = “…​” de l’annotation @ Bean du conteneur, dans ce cas, affecte le nom de la méthode getMyBeanName () au bean. Donc, le résultat sera “getMyBeanName” .

4. BeanFactoryAware

  • BeanFactoryAware est utilisé pour injecter l’objet BeanFactory ** . De cette façon, nous avons accès à la BeanFactory qui a créé l’objet.

Voici un exemple de classe MyBeanFactory :

public class MyBeanFactory implements BeanFactoryAware {

    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    public void getMyBeanName() {
        MyBeanName myBeanName = beanFactory.getBean(MyBeanName.class);
        System.out.println(beanFactory.isSingleton("myCustomBeanName"));
    }
}

Avec l’aide de la méthode setBeanFactory () , nous affectons la référence BeanFactory du conteneur IoC à la propriété beanFactory .

Après cela, nous pouvons l’utiliser directement comme dans la fonction getMyBeanName () .

Initialisons le MyBeanFactory et appelons la méthode getMyBeanName () :

MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class);
myBeanFactory.getMyBeanName();

Comme nous avons déjà instancié la classe MyBeanName dans l’exemple précédent, Spring invoquera l’instance existante ici.

La ligne beanFactory.isSingleton («myCustomBeanName») le vérifie.

5. Quand utiliser?

Le cas d’utilisation typique de BeanNameAware pourrait être l’acquisition du nom du bean à des fins de journalisation ou de câblage. Pour le BeanFactoryAware , il pourrait s’agir de la possibilité d’utiliser un haricot printanier à partir d’un code hérité.

Dans la plupart des cas, nous devrions éviter d’utiliser l’une des interfaces Aware , sauf si nous en avons besoin. L’implémentation de ces interfaces couplera le code au framework Spring.

6. Conclusion

Dans cet article, nous avons découvert les interfaces BeanNameAware et BeanFactoryAware et leur utilisation pratique.

Comme d’habitude, le code complet de cet article est disponible à l’adresse https://github.com/eugenp/tutorials/tree/master/spring-core [over sur GitHub.