स्प्रिंग सोर्स कोड यह समझाने के लिए कि
जब आप क्लास ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
में ApplicationContextAware काम करते हैं AbstractApplicationContext
, तो refresh()
विधि में निम्नलिखित कोड होते हैं:
prepareBeanFactory(beanFactory);
इस विधि को दर्ज करें, beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
AbstractCBtextAwareProcessor को AbstractrBeanFactory में जोड़ देगा।
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
beanFactory.setBeanClassLoader(getClassLoader());
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
...........
जब वसंत AbstractAutowireCapableBeanFactory
विधि में बीन को इनिशियलाइज़ करता है , तो बीन पोस्ट प्रक्रिया को लागू करने के लिए initializeBean
कॉल करें applyBeanPostProcessorsBeforeInitialization
। इस प्रक्रिया में एप्लिकेशनकॉन्टेक्ट इंजेक्ट करें।
@Override
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
result = beanProcessor.postProcessBeforeInitialization(result, beanName);
if (result == null) {
return result;
}
}
return result;
}
जब बीनपोस्टप्रोसेसर ऑब्जेक्ट को लागू करता है, तो पोस्टप्रोसेसबियरइन्फ्लेमेटाइजेशन विधि निष्पादित करें, उदाहरण के लिए ApplicationContextAwareProcessor
जो पहले जोड़ा गया था।
private void invokeAwareInterfaces(Object bean) {
if (bean instanceof Aware) {
if (bean instanceof EnvironmentAware) {
((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
}
if (bean instanceof EmbeddedValueResolverAware) {
((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(
new EmbeddedValueResolver(this.applicationContext.getBeanFactory()));
}
if (bean instanceof ResourceLoaderAware) {
((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
}
if (bean instanceof ApplicationEventPublisherAware) {
((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
}
if (bean instanceof MessageSourceAware) {
((MessageSourceAware) bean).setMessageSource(this.applicationContext);
}
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
}
}
}