Comment ApplicationContextAware travaux au Printemps?
Au printemps, si un bean implémente ApplicationContextAware
, alors qu'il est en mesure d'accéder à la applicationContext
. Par conséquent, il est en mesure d'obtenir d'autres haricots.
par exemple,
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext context) throws BeansException {
applicationContext = context;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
Puis SpringContextUtil.getApplicationContext.getBean("name")
pouvez obtenir le haricot "nom".
Pour ce faire, nous devons mettre cette SpringContextUtil
à l'intérieur de la applications.xml
, par exemple
<bean class="com.util.SpringContextUtil" />
Ici le haricot SpringContextUtil
ne comprend pas la propriété applicationContext
. Je suppose que quand le printemps bean initialiser, cette propriété est définie. Mais comment est-ce fait? Comment fonctionne la méthode setApplicationContext
appelée?
- C'est juste la façon dont des travaux du printemps. Printemps appels de méthode dans le cadre de l'initialisation du bean. Je ne vois pas le problème.
- Le printemps est de la Magie. Embrasser la magie
Vous devez vous connecter pour publier un commentaire.
Quand le printemps instancie des haricots, il recherche un couple d'interfaces comme
ApplicationContextAware
etInitializingBean
. S'ils sont trouvés, les méthodes sont invoquées. E. g. (très simplifié)Noter que dans la version plus récente, il peut être préférable d'utiliser des annotations, plutôt que la mise en œuvre de printemps des interfaces spécifiques. Maintenant, vous pouvez simplement utiliser:
ApplicationContext
, alors il ne peut pas être obtenu à partir deApplicationContextAware instance
soit. Parce queApplicationContextAware instance
obtient un bean à partir de la mêmeapplicationContext
objet comme celui injecté.Printemps de code source pour expliquer comment ApplicationContextAware travail
lorsque vous utilisez
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Dans
AbstractApplicationContext
classe,lerefresh()
méthode avez le code suivant:entrer dans cette méthode,
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
va ajouter ApplicationContextAwareProcessor à AbstractrBeanFactory.Quand le printemps initialiser haricot
AbstractAutowireCapableBeanFactory
,dans la méthode
initializeBean
,appelapplyBeanPostProcessorsBeforeInitialization
pour mettre en œuvre la fève de post-traitement. le processus d'injecter de l'applicationContext.quand BeanPostProcessor mettre en œuvre Objectto exécuter le postProcessBeforeInitialization méthode,par exemple
ApplicationContextAwareProcessor
qui a ajouté de l'avant.ApplicationContextAware Interface ,l'actuel contexte de l'application, à travers lequel vous pouvez appeler le printemps conteneur de services. Nous pouvons obtenir en cours applicationContext instance injecté par la méthode ci-dessous dans la classe