Comment injecter des dépendances dans un object auto-instancié au spring?

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

    • La réponse de @skaffman a presque 10 ans et cela ne veut pas dire que ce n’est pas suffisant ou ne fonctionne pas
    • La réponse de @ glaz666 est brève et ne m’a pas vraiment aidé à résoudre mon problème, mais m’a bien orienté

    Ma configuration

    1. Spring Boot 2.0.3 avec Spring Neo4j & Aop starts (ce qui n’est pas pertinent de toute façon)
    2. Instancier un bean lorsque Spring Boot est prêt à l’aide de l’approche @Configurable (à l’aide d’ ApplicationRunner )
    3. Gradle & Eclipse

    Pas

    Je devais suivre les étapes ci-dessous pour que cela fonctionne

    1. Le @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.
    2. Annoter le fichier XXXApplicaiton.java principal de Spring Boot (ou le fichier qui est annoté avec @SpringBootApplication ) avec @EnableSpringConfigured et @EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
    3. Ajoutez les dépendances dans votre fichier de construction (c.-à-d. Build.gradle ou pom.xml selon celui que vous utilisez) comstack('org.springframework.boot:spring-boot-starter-aop') et comstack('org.springframework:spring-aspects:5.0.7.RELEASE')
    4. New + up de votre 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.

    • Y a-t-il un conflit de version
    • Pourquoi org.springframework.context.annotation.aspect.* pas disponible
    • Votre installation IDE est-elle correctement configurée?
    • Etc.

    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 ?