155 votes

Comment injecter des dépendances dans un objet auto-instancié au printemps?

Disons que nous avons un cours:

 public class MyClass {
    @Autowired private AnotherBean anotherBean;
}
 

Ensuite, nous avons créé un objet de cette classe (ou un autre framework a créé l’instance de cette classe).

 MyClass obj = new MyClass();
 

Est-il possible d'injecter encore les dépendances? Quelque chose comme:

 applicationContext.injectDependencies(obj);
 

(Je pense que Google Guice a quelque chose comme ça)

227voto

skaffman Points 197885

Vous pouvez le faire en utilisant la méthode autowireBean() de AutowireCapableBeanFactory . Vous lui transmettez un objet arbitraire et Spring le traitera comme quelque chose qu’il aurait créé lui-même et appliquera les divers éléments de l'auto-câblage.

Pour mettre la main sur les AutowireCapableBeanFactory , il suffit d’autowire que:

 private @Autowired AutowireCapableBeanFactory beanFactory;

public void doStuff() {
   MyBean obj = new MyBean();
   beanFactory.autowireBean(obj);
   // obj will now have its dependencies autowired.
}
 

18voto

glaz666 Points 2313

Vous pouvez également marquer votre MyClass avec une annotation @Configurable:

 @Configurable
public class MyClass {
   @Autowired private AnotherClass instance
}
 

Ensuite, au moment de la création, il injectera automatiquement ses dépendances. Vous devez également avoir <context:spring-configured/> dans votre contexte d'application xml.

-5voto

matt b Points 73770

Non sans quelques solutions de contournement, car Spring ne sait rien de cette instance.

La vraie question est la suivante: pourquoi créez-vous les instances d'une classe dans laquelle vous souhaitez que les dépendances soient injectées manuellement, plutôt que de laisser Spring le contrôler? Pourquoi la classe qui utilise MyClass se fait-elle pas injecter MyClass ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X