Je développe un projet SpringBoot et je veux obtenir le bean par son nom en utilisant applicationContext
. J'ai essayé plusieurs solutions sur le Web mais je n'ai pas réussi. Mon exigence est d'avoir un contrôleur
ControllerA
et à l'intérieur du contrôleur j'ai une méthode getBean(String className)
. Je veux obtenir une instance de haricot enregistré. J'ai des entités d'hibernation et je souhaite obtenir une instance du bean en transmettant le nom de la classe uniquement dans la méthode getBean
.
S'il vous plaît aider si quelqu'un connait la solution.
Vous pouvez transférer automatiquement le champ ApplicationContext, en tant que champ
@Autowired
private ApplicationContext context;
ou une méthode
@Autowired
public void context(ApplicationContext context) { this.context = context; }
Enfin utiliser
context.getBean(SomeClass.class)
Vous pouvez utiliser ApplicationContextAware.
ApplicationContextAware:
Interface à implémenter par tout objet souhaitant être averti du champ ApplicationContext dans lequel il s'exécute. L'implémentation de cette interface est utile, par exemple, lorsqu'un objet nécessite l'accès à un ensemble de beans en collaboration.
Il existe quelques méthodes pour obtenir une référence au contexte de l'application. Vous pouvez implémenter ApplicationContextAware comme dans l'exemple suivant:
package hello;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public ApplicationContext getContext() {
return applicationContext;
}
}
Mise à jour:
Lorsque Spring instancie des beans, il recherche les implémentations de ApplicationContextAware. Si elles sont trouvées, les méthodes setApplicationContext () seront invoquées.
De cette manière, Spring définit current applicationcontext.
Extrait de code extrait de source code
:
private void invokeAwareInterfaces(Object bean) {
.....
.....
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware)bean).setApplicationContext(this.applicationContext);
}
}
Une fois que vous avez obtenu la référence au contexte de l'application, vous devez extraire le bean de votre choix à l'aide de getBean ().
en fait, vous voulez obtenir l’objet à partir du moteur Spring, le moteur conservant déjà l’objet de la classe requise au démarrage de l’application Spring (initialisation du moteur Spring). Il ne vous reste plus qu’à obtenir cet objet une référence.
dans une classe de service
@Autowired
private ApplicationContext context;
SomeClass sc = (SomeClass)context.getBean(SomeClass.class);
maintenant dans la référence de la sc vous rencontrez l'objet. Hope a bien expliqué. En cas de doute, s'il vous plaît faites le moi savoir.
Si vous êtes à l'intérieur du bean Spring (dans ce cas, @Controller
bean), vous ne devez absolument pas utiliser l'instance de contexte Spring. Juste autowire className
haricot directement.
BTW, évitez d'utiliser l'injection sur le terrain car c'est considéré comme une mauvaise pratique.
Vous pouvez utiliser la classe ApplicationContextAware pouvant fournir le contexte de l'application.
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext ctx = null;
public static ApplicationContext getApplicationContext() {
return ctx;
}
@Override
public void setApplicationContext(final ApplicationContext ctx) throws BeansException {
ApplicationContextProvider.ctx = ctx;
}
/**
* Tries to autowire the specified instance of the class if one of the specified
* beans which need to be autowired are null.
*
* @param classToAutowire the instance of the class which holds @Autowire
* annotations
* @param beansToAutowireInClass the beans which have the @Autowire annotation
* in the specified {#classToAutowire}
*/
public static void autowire(Object classToAutowire, Object... beansToAutowireInClass) {
for (Object bean : beansToAutowireInClass) {
if (bean == null) {
ctx.getAutowireCapableBeanFactory().autowireBean(classToAutowire);
}
}
}
}
Il suffit d'utiliser:
org.springframework.beans.factory.BeanFactory # getBean (Java.lang.Class)
Exemple:
@Component
public class Example {
@Autowired
private ApplicationContext context;
public MyService getMyServiceBean() {
return context.getBean(MyService.class);
}
// your code uses getMyServiceBean()
}