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
的自動裝配