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
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