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)
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 obtenir le 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.
}
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 devriez aussi avoir <context:spring-configured/>
dans votre contexte d'application xml.
Je viens d'avoir le même besoin et dans mon cas, c'était déjà la logique à l'intérieur non gérable de la classe Java) qui avait accès à ApplicationContext
. Inspiré par scaffman. Résolu par:
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(manuallyCreatedInstance);
Je voulais partager ma solution qui suit l'approche @Configurable
En tant que briefly
mentionnée dans @ glaz666 réponse parce que
Spring Neo4j & Aop starts
(Ce qui n’est de toute façon pas pertinent)Spring Boot
Est prêt en utilisant l'approche @Configurable
(En utilisant ApplicationRunner
)Je devais suivre les étapes ci-dessous afin de le faire fonctionner
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)
à placer sur votre Bean
à instancier manuellement. Dans mon cas, les Bean
à instancier manuellement ont des services @Autowired
, Par conséquent, les accessoires de l'annotation ci-dessus.XXXApplicaiton.Java
Du démarrage de printemps (ou le fichier annoté avec @SpringBootApplication
) Avec le @EnableSpringConfigured
Et la @EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
compile('org.springframework.boot:spring-boot-starter-aop')
et compile('org.springframework:spring-aspects:5.0.7.RELEASE')
Bean
qui est annoté avec @Configurable
N'importe où et ses dépendances devraient être automatiquement câblées.* En ce qui concerne le point 3 ci-dessus, je suis conscient que le org.springframework.boot:spring-boot-starter-aop
Tire de manière transitoire le spring-aop
(Comme indiqué ici mavencentral ) mais, dans mon cas, l'Eclipse a échoué. pour résoudre les annotations @EnableSpringConfigured
, par conséquent, j’ai explicitement ajouté la dépendance spring-aop
en plus du démarreur. Si vous rencontrez le même problème, déclarez simplement votre dépendance ou partez à l’aventure pour comprendre
org.springframework.context.annotation.aspect.*
N'est pas disponible