Spring source code to explain how ApplicationContextAware works
when you use ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
In the AbstractApplicationContext class, the refresh() method has the following code:
// Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory);
enter this method, beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); Add ApplicationContextAwareProcessor to AbstractrBeanFactory.
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
When spring initializes the bean in AbstractAutowireCapableBeanFactory , in the initializeBean method, call applyBeanPostProcessorsBeforeInitialization to implement the post bean process. this process involves injection of applicationContext.
@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; }
when a BeanPostProcessor implements an Object to execute a postProcessBeforeInitialization method, such as ApplicationContextAwareProcessor , which was added earlier.
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); } } }
Edward Nov 30 '16 at 15:16 2016-11-30 15:16
source share