04详细介绍1

注:
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后置处理器。

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值