一、refresh()方法之prepareBeanFactory(beanFactory)方法
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
二、prepareBeanFactory(beanFactory)方法詳解
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// Tell the internal bean factory to use the context's class loader etc.
// 設置類加載器:存在則直接設置/不存在則新建一個默認類加載器
beanFactory.setBeanClassLoader(getClassLoader());
// 設置beanFactory的表達式語言處理器,Spring3增加了表達式語言的支持
// 默認可以使用#{bean.xxx}的形式來調(diào)用相關(guān)屬性值
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
//設置屬性注冊解析器PropertyEditor
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
// Configure the bean factory with context callbacks.
// 將當前的ApplicationContext對象交給ApplicationContextAwareProcessor類來處理,從而在Aware接口實現(xiàn)類中的注入applicationContext
// 通過ApplicationContextAwareProcessor#invokeAwareInterfaces進行aware接口信息回調(diào)
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
//設置忽略自動裝配的接口
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
// BeanFactory interface not registered as resolvable type in a plain factory.
// MessageSource registered (and found for autowiring) as a bean.
// 注冊可以解析的自動裝配
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
// Register early post-processor for detecting inner beans as ApplicationListeners.
//將當前applicationContext交給ApplicationListenerDetector類處理
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
// Detect a LoadTimeWeaver and prepare for weaving, if found.
// 如果當前BeanFactory包含loadTimeWeaver Bean,說明存在類加載期織入AspectJ,
// 則把當前BeanFactory交給類加載期BeanPostProcessor實現(xiàn)類LoadTimeWeaverAwareProcessor來處理,
// 從而實現(xiàn)類加載期織入AspectJ的目的.
if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
// Set a temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
// Register default environment beans.
//注冊當前容器環(huán)境environment組件Bean
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
// 注冊系統(tǒng)配置systemProperties組件Bea
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
//注冊系統(tǒng)環(huán)境systemEnvironment組件Bean
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}
}
三、總結(jié)
prepareBeanFactory主要做的:
- 設置beanFactory的classLoader為當前context的classLoader。
- 設置beanFactory的表達式語言處理器。
- 添加Aware回調(diào)接口的后處理器ApplicationContextAwareProcessor。
- 設置需要忽略自動裝配的接口。
- 增加對AspectJ的支持。
- 添加默認的系統(tǒng)環(huán)境bean。