通過實現 Aware 介面,可以在 Spring 啟動時,調用介面定義的方法,將 Spring 底層的一些組件註入到自定義的 Bean 中。 下麵列出了幾個 Spring 在 Aware 介面基礎上,進行擴展的介面,分別會在創建 Bean 時直接執行,或者通過 BeanPostProcessor 間 ...
通過實現 Aware 介面,可以在 Spring 啟動時,調用介面定義的方法,將 Spring 底層的一些組件註入到自定義的 Bean 中。
下麵列出了幾個 Spring 在 Aware 介面基礎上,進行擴展的介面,分別會在創建 Bean 時直接執行,或者通過 BeanPostProcessor 間接執行:
// 應用上下文 ApplicationContext
ApplicationContextAware
// 事件派發器
ApplicationEventPublisherAware
// 國際化
MessageSourceAware
// 資源載入器
ResourceLoaderAware
// 環境
EnvironmentAware
// 值解析器
EmbeddedValueResolverAware
BeanFactoryAware
// Bean 名字
BeanNameAware
// 類載入器
BeanClassLoaderAware
// @Import 相關
ImportAware
直接執行
見Spring 後置處理器源碼中,initializeBean() 調用的方法 invokeAwareMethods(),這個方法分別會直接執行 BeanNameAware、BeanClassLoaderAware、BeanFactoryAware,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) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}
間接執行
繼續看 invokeAwareMethods() 調用的 applyBeanPostProcessorsBeforeInitialization(),它會遍歷和執行容器中所有的 BeanPostProcessor,而 ApplicationContextAwareProcessor 也是 BeanPostProcessor 的一個實現類,它的主要源碼如下:
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
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);
}
}
return bean;
}
ImportAware 見Spring AOP源碼
總結
調用 refresh()-->finishBeanFactoryInitialization(beanFactory); 創建 Bean 時,會執行 Aware 的一些實現類。
- 通過直接執行的方式,執行 Aware 的一些基礎介面方法。
- 通過 BeanPostProcessor 間接執行更高級的 Aware 實現類。