bean的创建流程

bean在spring中的生命周期

使用

以下为一个bean的获取并使用流程

1
2
3
4

DefaultListableBeanFactory factory = new XmlBeanFactory(new ClassPathResource("bean.xml"));
Object bean = factory.getBean("bean");
bean.toString();

流程

  • 首先是加载配置信息,这一步在XmlBeanFactory创建出来之后就完成了。在其中保存了bean的相关信息,比如id、name、类型、构造方法参数等等

  • getBean方法中去真正创建bean

  • 如果是单例模式,且缓存中有这个bean,就直接返回。没有则进行下一步

  • Prototypre模式的做循环依赖检查

  • 如果有父Factory,且当前工厂没有这个bean的配置信息,则交给父类工厂创建。在ssm模式中一般存在两个容器:Spring和SpringMVC,应该就是这种关系,确保MVC容器可以访问父类容器的bean

  • 查找依赖,这一步也会进行循环依赖检查。有依赖的情况下,就开始递归创建依赖bean

  • 根据不同的scope开始创建流程,在此暂时只讨论singleton类型的bean,也就是getSingleton(String beanName, ObjectFactory<?> singletonFactory)

    • 首先会将当前beanName添加到singletonsCurrentlyInCreation
    • 调用AbstractAutowireCapableBeanFactory#createBean方法
    • BeanPostProcessors会被调用,可以用来创建代理,然后直接返回
    • 如果没有代理,则进入Spring的创建方法doCreateBean
    • 再然后就是根据配置信息,决定用哪种实例化方案
    • 当实例创建后,就会根据条件决定放不放入singletonObjects,同时从earlySingletonObjects中清除
    • 再然后的方法getEarlyBeanReference说是可以注入aop,但是暂时没有找到相关代码
  • 接着开始注入属性,,一般来说就是通过name、type注入;如果有循环依赖的话,就去缓存里获取半成品bean

  • 初始化bean,一般就是调用一些相关方法,比如init-method,继承的接口,以及一些BeanPostProcessor

  • 注册销毁处理器,销毁时调用相关方法

  • 最后通过一个getObjectForBeanInstance来处理一些诸如factory-bean类型,获取真正的bean

ApplicationContext

实际开发中,基本不会用BeanFactory的方式,都是使用ApplicationContext。这里已ClassPathXmlApplicationContext为例

  • 检查当前环境,例如判断是否有环境变量未设置
  • 创建beanFactory
  • 注册激活BeanFactory处理器,例如注入后置处理器,事件监听器
  • 初始化所有单例bean
  • 事件通知

再配上一张SpringMVC流程图

SpringMVC流程

参考资料

请别再问Spring Bean的生命周期了!


bean的创建流程
http://blog.inkroom.cn/2021/06/09/16VTBQC.html
作者
inkbox
发布于
2021年6月9日
许可协议