Spring Aware自动装配有两种实现方式:
- 在初始化Bean的
initializeBean
方法中执行invokeAwareMethods
方法 - 通后置处理器
ApplicationContextAwareProcessor
来实现的,它实现了BeanPostProcessor
接口
invokeAwareMethods
我们在初始化Bean
的时候,为了保证一部分Aware
必须在后置处理器postProcessBeforeInitialization
方法之前执行,所以在Bean
初始化之前直接调用了invokeAwareMethods
方法。源码如下:
private void invokeAwareMethods(final String beanName, final Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}
ApplicationContextAwareProcessor
除了上诉涉及的Aware
,剩余部分的Aware
的自动装配都是在ApplicationContextAwareProcessor#postProcessBeforeInitialization
中实现的,该方法最终会去调用invokeAwareInterfaces
方法。源码如下:
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(this.embeddedValueResolver);
}
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);
}
}
}
总结
从上面源码我们可以看出,不管是哪种实现方式,我们执行过程都是一样的:
- 判断是否实现了
Aware
接口 - 判断具体实现了那个
Aware
接口 - 直接调用
XxxAware
接口的特有方法实现XxxAware
的自动装配