Spring中bean的生命周期流程

加载  -> 解析 -> 实例化 -> 依赖注入 -> 初始化 -> 销毁

流程图

AnnotationConfigApplicationContex或者 ClassPathXmlApplicationContext

都会进入AbstractApplicationContext  的 refresh方法

1.obtainFreshBeanFactory() 解析XML 封装成BeanDefinitions

BeanDefinitions里会存放beanName beanClass 是否单例 是否懒加载这些字段

先会创建BeanFactory对象 调用refreshBeanFactory() 实例beanFactory

解析XML的bean 并封装成BeanDefinition对象

loadBeanDefinitions(beanFactory) 创建xml的解析器 XmlBeanDefinitionReader

loadBeanDefinitions(beanDefinitionReader);

获取需要加载的xml配置文件 ConfigLocations.getConfigLocations();

把字符串类型的xml文件路径,形如:classpath*:user/**/*-context.xml,转换成Resource对象类型,其实就是用流

doLoadBeanDefinitions  把读到的封装成Document文件对象

registerBeanDefinitions(doc, resource); 根据解析出来的document对象,拿到里面的标签元素封装成BeanDefinition

doRegisterBeanDefinitions(doc.getDocumentElement())传进去xml元素

parseBeanDefinitions(root, this.delegate); 标签具体解析过程

parseDefaultElement解析标签元素

processBeanDefinition解析bean标签

registerBeanDefinition完成BeanDefinition的注册 beanName beanClass等

把BeanDefinition放到BeanDefinitionMap中缓存

把beanName放到beanDefinitionNames list中,这个list着重记住,bean实例化的时候需要用到

2.invokeBeanFactoryPostProcessors(beanFactory)

扫描@Component注解

找到所有实现了BeanDefinitionRegistryPostProcessor的类,执行

postProcessBeanDefinitionRegistry方法 这个方法可以直接把一个类注册成beanDefinition

找到所有实现了BeanFactoryPostProcessor的类,执行

postProcessBeanFactory方法可以扩展用

3.registerBeanPostProcessors(beanFactory)把实现了BeanPostProcessor接口的类实例化,并且加入到BeanFactory中 

4.finishBeanFactoryInitialization(beanFactory) baean实例化 DI 初始化

bean实例化过程

1.finishBeanFactoryInitialization(beanFactory)

2.beanFactory.preInstantiateSingletons(); 具体实例化过程

3.从beanDefinitionNames里面拿到所有的beanDefinition的beanNams

然后循环的 实例化 DI 初始化

4.进入getBean准备获取实例

5.getBean进入doGetBean 会判断这个bean是单例还是原型

6.如果是单例  singletonFactory.getObject()获取singletonObject(单例容器) 如果没有就会creatBean 

如果是原型 每次都会creatBean

7.creatBean 调用 doCreatBean 创建实例

8.doCreatBean  BeanWrapper 先判断是否是单例 如果是单例从

createBeanInstance  通过反射创建BeanWrapper 实例

进入DI流程

9.populateBean 依赖注入的方法

找到filed 并且自动赋值,比如autowired注解的对象,没有就会getBean先去创建 最后返回原来bean的流程

进入初始化流程

10.initializeBean 初始化方法

//生命周期一部分

11.invokeAwareMethods(beanName, bean);

BeanFactoryAware,BeanClassLoaderAware BeanNameAware都继承Aware接口

如果这个bean实现了Aware接口  

就会调用BeanNameAware的setBeanName方法

BeanFactoryAware,BeanClassLoaderAware同理

12.applyBeanPostProcessorsBeforeInitializatior()

13.invokeInitMethods

如果有类实现了BeanPostProcessor接口 就会调用实现他的postProcessBeforeInitialization与postProcessAfterInitialization这两个方法

@PostConstrust

InitializingBean接口 afterPropertiesSet方法

14.applyBeanPostProcessorsAfterInitialization(AOP)

最后的对象交给singletonObjects容器(一级缓存)

Bean销毁

1.如果scope不是单例,则跟随JVM销毁

2.如果scope是单例,则容器回收的时候,会进行回收

如果Bean实现了DisposableBean接口,则在容器关闭时,调用Bean的

destroy方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w7486

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值