Pourquoi n’ai-je pas besoin de @Autowired sur les méthodes @Bean dans une classe de configuration Spring?

Pourquoi ça marche:

@Configuration public class MyConfig { @Bean public A getA() { return new A(); } @Bean <-- Shouldn't I need @Autowired here? public B getB(A a) { return new B(a); } } 

Merci!

@Autowire vous permet d’injecter des haricots d’un contexte à un “monde extérieur”, le monde extérieur étant votre application. Étant donné qu’avec les classes @Configuration , vous vous trouvez dans un “monde de contexte”, il n’est pas nécessaire d’exploiter explicitement le fichier autowire (bean de recherche du contexte).

Pensez à l’analogie comme lors de l’access à une méthode à partir d’une instance donnée. Tant que vous vous trouvez dans la scope de l’instance, il n’est pas nécessaire d’écrire this pour accéder à la méthode d’instance, mais le monde extérieur devra utiliser une référence d’instance.

modifier

Lorsque vous écrivez la classe @Configuration , vous spécifiez des métadonnées pour les beans qui seront créés par IOC.

@Autowire annotation @Autowire par contre vous permet d’injecter des beans initialisés , pas des méta-données, dans l’application. Donc, l’injection explicite n’est pas nécessaire car vous ne travaillez pas avec des Beans lorsque vous êtes dans la classe de Configuration .

Une classe avec l’annotation @Configuration est l’endroit où vous définissez vos beans pour le contexte. Mais un haricot printanier devrait définir ses propres dépendances. Quatre cas, la classe B doit définir ses propres dépendances dans la définition de la classe. Par exemple, si votre classe B dépend de votre classe A, procédez comme suit:

 public class B { @Autowired A aInstance; public A getA() { return aInstance; } public void setA(A a) { this.aInstance = a; } } 

Dans le cas ci-dessus, pendant que spring construit son contexte, il recherche le bean de type A, qui est également défini en tant que bean de votre classe de configuration, et le transmet automatiquement à B lors de l’exécution afin que B puisse l’utiliser à tout moment.