Disons que nous avons une classe:
public class MyClass { @Autowired private AnotherBean anotherBean; }
Ensuite, nous avons créé un object 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)
Vous pouvez le faire en utilisant la méthode autowireBean()
de AutowireCapableBeanFactory
. Vous lui passez un object arbitraire, et Spring le traitera comme quelque chose qu’il a lui-même créé, et appliquera les différentes parties de la création automatique.
Pour mettre la main sur AutowireCapableBeanFactory
, il suffit de lancer:
private @Autowired AutowireCapableBeanFactory beanFactory; public void doStuff() { MyBean obj = new MyBean(); beanFactory.autowireBean(obj); // obj will now have its dependencies autowired. }
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
dans votre contexte d’application xml.
Juste le même besoin et dans mon cas, c’était déjà la logique à l’intérieur de la classe java non gérable qui avait access à ApplicationContext
. Inspiré par le scaffman. Résolu par:
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory(); factory.autowireBean(manuallyCreatedInstance);
Je voulais partager ma solution qui suit l’approche @Configurable
comme mentionné briefly
dans @ glaz666 réponse parce que
Spring Neo4j & Aop starts
(ce qui n’est pas pertinent de toute façon) Spring Boot
est prêt à l’aide de l’approche @Configurable
(à l’aide d’ ApplicationRunner
) Je devais suivre les étapes ci-dessous pour que cela fonctionne
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)
doit être placé au-dessus de votre Bean
à instancier manuellement. Dans mon cas, le Bean
qui doit être instancié manuellement a @Autowired
services @Autowired
, les annotations des @Autowired
ci-dessus. XXXApplicaiton.java
principal de Spring Boot (ou le fichier qui est annoté avec @SpringBootApplication
) avec @EnableSpringConfigured
et @EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
comstack('org.springframework.boot:spring-boot-starter-aop')
et comstack('org.springframework:spring-aspects:5.0.7.RELEASE')
Bean
qui est annoté avec @Configurable
n’importe où et ses dépendances doivent être automatisées. * En ce qui concerne le point n ° 3 ci-dessus, je suis conscient que org.springframework.boot:spring-boot-starter-aop
tire de manière transitoire le spring-aop
(comme montré ici mavencentral ) mais, dans mon cas, l’Eclipse n’a pas résolu le @EnableSpringConfigured
annotations pourquoi, j’ai ajouté explicitement la dépendance spring-aop
en plus du starter. Si vous rencontrez le même problème, déclarez simplement la dépendance ou lancez-vous dans l’aventure.
org.springframework.context.annotation.aspect.*
pas disponible Non sans quelques solutions, car Spring ne sait rien de cette instance.
La vraie question est la suivante: pourquoi créez-vous des instances d’une classe que vous voulez injecter manuellement dans des dépendances, plutôt que de laisser Spring le contrôler? Pourquoi la classe utilisant MyClass
fait-elle MyClass
injecter MyClass
?