注:
1、可以把该篇文章复制到notepad++里,这样双击某个方法名,周边相同的也会高亮,方便理解整篇内容。
2、看代码时请在ClassPathXmlApplicationContext上按ctrl+t得到下面,然后用Snipaste截下来钉在屏幕右侧,
因为一边看代码一边发现有些方法穿插在各种中间类里,比如当你在看下面爸爸4里某个抽象方法比如
refreshBeanFactory,当你在refreshBeanFactory按ctrl+t不确定看哪个实现类时,此时从屏幕右侧钉住的截图
里就能发现应该看AbstractRefreshableApplicationContext
简单的认为ClassPathXmlApplicationContext有4个爸爸,每个爸爸有特定的功能,
爸爸1:AbstractXmlApplicationContext 略
爸爸2:AbstractRefreshableConfigApplicationContext 略
爸爸3:AbstractRefreshableApplicationContext 略
爸爸4:AbstractApplicationContext 核心功能类,refresh方法出自他手
这里详细介绍AbstractApplicationContext.refresh里的子方法(部分复杂的放到下一篇讲)代码。
1、prepareRefresh();方法 就是定义一些标志位比如active为true和开始时间startupDate为当前时间
2、ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()方法{ //创建beanFactory对象
1、refreshBeanFactory();//-->爸爸3AbstractRefreshableApplicationContext.refreshBeanFactory方法(){
1.DefaultListableBeanFactory beanFactory = createBeanFactory();
//createBeanFactory-->return new DefaultListableBeanFactory(getInternalParentBeanFactory());
//getInternalParentBeanFactory用于获取父容器的beanFactory,一般为null
2.beanFactory.setSerializationId(getId());//getId-->ObjectUtils.identityToString(this)-->就是对象.toString()
3.customizeBeanFactory(beanFactory);
//设置beanFactory的autowireCandidateResolver属性小弟,
//beanFactory.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
4.loadBeanDefinitions(beanFactory);//爸爸1AbstractXmlApplicationContext.loadBeanDefinitions,这个放到下一篇说,很麻烦
5.this.beanFactory = beanFactory;
}
2、ConfigurableListableBeanFactory beanFactory = getBeanFactory();//-->爸爸3AbstractRefreshableApplicationContext.getBeanFactory方法(){
return this.beanFactory;
}
}
3、prepareBeanFactory(beanFactory);方法 给beanFactory设置一堆众小弟,想看有哪些小弟来这个方法
4、postProcessBeanFactory(beanFactory);空方法 通过方法doc可知该方法用于开发者在创建beanFactory对象之后做一些额外的工作,比如往里注册MyXxBeanPostProcessor
5、invokeBeanFactoryPostProcessors(beanFactory);方法 通过方法doc可知调用所有BeanFactory后置处理器,参见下面附录A1。
6、registerBeanPostProcessors(beanFactory);方法 通过doc可知注册所有bean后置处理器到beanFactory里,即把这些后置处理器对象加入到beanFactory的beanPostProcessors里(这是个ArrayList<BeanPostProcessor>)。
7、initMessageSource();方法 通过doc可知注册什么消息源对象,暂时忽略
8、initApplicationEventMulticaster();方法 通过doc可知注册事件广播对象,暂时略
9、onRefresh();空方法 通过doc可知这是父类提供给子类实现个性化功能的模板空方法,没人用略
10、registerListeners();方法 通过doc可知注册监听器对象,跟上面事件广播是配套的,暂时忽略
11、finishBeanFactoryInitialization(beanFactory);方法 通过代码可知这里在做最后的beanFactory配置工作,先是设置conversionService属性,然后冻结beanFactory的所有BeanDefinition配置,最后预实例化所有bean。
12、finishRefresh();方法 通过代码可知这里在做最后的applicationContext的配置工作,先是初始化生命周期处理器,接着调用这些生命周期处理器的onRefresh方法,然后发布上下文刷新事件,最后往一个MBean里注册applicationContext对象,暂时略
总结:做了如下几件事
1、创建beanfactory对象
2、把xml转为BeanDefinition对象放到beanfactory里
3、根据BeanDefinition对象实例化Bean
4、调用2种后置处理器,分别做个性化注册BeanDefinition、个性化修改beanFactory操作
附录:
A1、invokeBeanFactoryPostProcessors方法逻辑:
1、调用appliationContext的所有 BeanDefinitionRegistryPostProcessor 对象
的 postProcessBeanDefinitionRegistry(registry)方法//registry就是beanFactory
实现开发者针对BeanFactory做注册BeanDefinition的个性化需求
2、调用beanFactory的所有 BeanDefinitionRegistryPostProcessor 对象
的 postProcessBeanDefinitionRegistry(registry)方法
实现开发者针对BeanFactory做注册BeanDefinition的个性化需求
3、调用appliationContext的所有 BeanDefinitionRegistryPostProcessor 对象
的 postProcessBeanFactory(beanFactory)方法
实现开发者修改BeanFactory的个性化需求
4、调用beanFactory的所有 BeanDefinitionRegistryPostProcessor 对象
的 postProcessBeanFactory(beanFactory)方法
实现开发者修改BeanFactory的个性化需求
5、调用appliationContext的所有 BeanFactoryPostProcessor 对象
的 postProcessBeanFactory(beanFactory)方法
实现开发者修改BeanFactory的个性化需求
6、调用beanFactory的所有 BeanFactoryPostProcessor 对象
的 postProcessBeanFactory(beanFactory)方法
实现开发者修改BeanFactory的个性化需求
注:这里按优先级PriorityOrdered接口、Ordered接口、无顺序三种归类
6.1、对优先级类型的集合排序后依次调用 postProcessBeanFactory(beanFactory)方法
6.2、对Ordered类型的集合排序后依次调用 postProcessBeanFactory(beanFactory)方法
6.3、对无顺序类型的集合依次调用 postProcessBeanFactory(beanFactory)方法
上面比较啰嗦,简单总结上面策略为调用 BeanDefinitionRegistryPostProcessor 对象
的postProcessBeanDefinitionRegistry(registry)方法【个性化注册BeanDefinition】
和postProcessBeanFactory(beanFactory)方法【个性化修改beanFactory】,
然后调用 BeanFactoryPostProcessor 对象
的postProcessBeanFactory(beanFactory)方法【个性化修改beanFactory】,
整体上优先调用application的beanFactory后置处理器再调用beanFactory的beanFactory后置处理器。