spring容器启动refresh 准备prepareBeanFactory工厂
AbstractApplicationContext 中的prepareBeanFactory方法解析
spring 中执行ac.refresh() 方法来更新spring上下文,这篇开始解析refresh方法中调用的 prepareBeanFactory方法
1. prePareBeanFactory 方法源码
prePareBeanFactory
public abstract class AbstractApplicationContext extends DefaultResourceLoader
implements ConfigurableApplicationContext {
///省略部分代码
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// Tell the internal bean factory to use the context's class loader etc.
beanFactory.setBeanClassLoader(getClassLoader());
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
// Configure the bean factory with context callbacks.
// 配置Bean 工厂上下文回调
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); // 添加 ApplicationContextAwareProcessor Bean后置处理器 这个处理器与 EnvironmentAware、EmbeddedValueResolverAware、ApplicationContextAware 等有关系, 使用前置处理器执行下面忽略的六个Aware接口 ,
//关于ApplicationContextAwareProcessor类介绍请查看:[ApplicationContextAwareProcessor类描述](http://t.csdn.cn/hBVaZ)
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.
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
// Detect a LoadTimeWeaver and prepare for weaving, if found.
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.
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}
}
///省略部分代码
}
2. BeanFactory 添加Bean后置处理器ApplicationContextAwareProcessor
ApplicationContextAwareProcessor介绍文章 可以看我一篇博客
3. ignoreDependencyInterface解析
beanFactory.ignoreDependencyInterface(InteraceName.class);
忽略该接口的实现类中和接口setter方法入参类型相同的依赖
我们知道自动装配byName byType 是通过set方法实现的,autowiring 指的的是XML 文件配置的 default-autowire ,具体介绍看
我其中一篇文章:spring ignoreDependencyInterface讲解
4. beanFactory.registerResolvableDependency 方法
registerResolvableDependency 的作用
5. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
ApplicationListenerDetector:主要作用:
1、在Bean初始化完成之后:如果Bean是单例的则并且bean instanceof ApplicationListener。加入到this.applicationListeners中。
2、在Bean销毁之前搞事情: 如果Bean是一个ApplicationListener,则会从ApplicationEventMulticaster(事件广播器)中提前删除了。