Spring源码(一)启动流程,生命周期

Spring源码(一)启动流程,生命周期

bean启动流程

在这里插入图片描述
通常我们定义xml、yaml文件,需要一个解析器将xml信息读到beandefinition中,这个就是备案DefinitionReader,实际上是创建了一个xmlbeanDefinitionReader,然后将解析好的document文件设置到BeanDefinition,此时需要将BeanDefinition设置到beanfactory中,需要设置beanDefinitionMap与beanDefinitionName。生成完成了beandefition后,需要经过beanFactoryPostProcessor,通常是对beanDefinition做一些增强,比如这里有对xml文件的${}的替换函数 PlaceholderConfigurerSupport。然后就是bean的生命周期了,这里首先需要实例化,对bean默认值,然后就是初始化操作了。
初始化操作分为5个步骤,首先需要对bean赋真正意义的值,其次设置aware接口属性,比如果需要容器的其他对象,此时可以将对象实现Aware接口,来满足当前的需要。然后就到了beanbeforePostProcessor、init-method、beanAfterPostProcessor。通常AOP操作就在beanAfterPostProcessor。

这里注意FactoryBean与BeanFactory有什么区别?
都是用来创建对象的当使用BeanFactory的时候必须要遵循完整的创建过程,这个过程是由spring来管理控制的,而使用FactoryBean只需要调用getObject就可以返回具体的对象,整个对象的创建过程是由用户自己来控制的,更加灵活。FactoryBean只需要三个参数,IsSingleton、getObject、getObjectType。

ReFlush方法

作为Spring的AbstractApplicationContext的reflush方法,大名鼎鼎,基本可以说只要理解reflush方法,Spring源码就通透了。这里简单的写一下12个方法的作用。

1、首先是prepareRefresh方法,作容器刷新前的准备工作。
主要工作:设置开机时间(stattupDate),设置活跃的标志位(active)、获取环境对象(getEnvironment)、设置监听器与监听事件的集合(但是都是空的)(在springboot有用)。

2、ObtainFreshBeanFactory方法,获得一个bean工厂;有两个工厂,listablebeanFactory(课以枚举的bean工厂)与configurableBeanFactory,configurebeanFactoy父接口时HirearchicalBeanFactory(可以继承关系的bean工厂)。而defaultListableBeanFactory就是默认创建的bean工厂。OFBF方法里有refreshbeanfactory,主要逻辑判断是否有bean工厂,没有那么创建,用createbeanfactory方法创建defaultlistablebeanfactory默认工厂。后面对工厂赋属性值,包括loadbeandefinitions,加载beandefinition。
主要工作:创建容器对象,并加载xml配置文件的属性到当前工厂中,最重要的时BeanDefinition加载了。

3、PrepareBeanFactory方法,增加beanpostprocessor,还有忽略aware。
主要工作:设置对beanFactory某些初始化操作。

4、PostprocessBeanFactory方法,执行beanfactory的后置处理器,但是里面空的,扩展用的。

5、InvokeBeanFactoryPostProcessors()方法,在实例化之前必须要调用。
主要工作:实例化并且执行beanfactorypostprocessor操作。

6、registerBeanPostProcessors方法(前戏工作)实例化并注册所有beanpostProcessor。

7、initMessageSource方法(前戏工作)国际化的设置,无所谓的。

8、InitApplicationEventMulticaster方法,(前戏工作)初始化事件的广播器

9、OnRefresh方法,(前戏工作)也是空方法实现,springboot给tomcat

10、RegisterListeners方法,(前戏工作)注册监听器的方法

11、FinishBeanFactoryInitialization方法,实例化与初始化都在这里完成的。很重要!!!

12、FinishRefresh方法

接下来记录下debug源码跟进去的各个方法的作用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值