Spring Bean 的生命周期

Bean生产阶段

一、加载Bean

loadBeanDefinitions方法用xml、注解扫描等方式找到bean,放入beanDefinitionMap,然后遍历该集合,并通过createBean方法来创建bean对象。

二、创建Bean对象

  1. 构造对象
  • 通过createBeanInstance方法来构造对象。

  • 获取构造方法,用反射从bean定义的beanClass拿到这个类的构造方法

    • 如果只有一个构造方法,将直接使用这个构造方法,而不管这个构造方法有没有入参。
    • 如果有多个构造方法,优先使用带有@Autowired注解的构造方法,如果多个构造方法都加了@Autowired注解,会报错。
    • 如果构造方法都没有@Autowired注解,将优先使用无参方法。
    • 如果多个方法都是有参的,会报错。
  • 准备参数(若使用的是无参构造方法,则无需参数直接构造)

    • 在单例池中,根据参数的Class类进行查找。
    • 如果这个类有多个实例,则会根据参数名再进行匹配。
    • 如果没有找到,会报错。
  • 通过反射进行bean的构造(实例化)

  1. 属性填充
  • 通过populateBean方法对bean的属性进行赋值填充(通过为@Autowired注解的这些变量),通过三级缓存机制进行填充,也就是依赖注入。
  1. 初始化实例
  • 先通过initializeBean方法对实例进行初始化。
  • 再通过invokeAwareMethods方法,实现各种Aware接口(BeanNameAwareBeanFactoryAwareApplicationContextAware)的Bean设置BeanNameBeanFactoryApplicationContext容器信息(Aware接口代表"信息感知"接口)。
  • 然后通过invokeInitMethods方法执行Bean的初始化方法,这个方法是通过实现InitiallizingBean接口而实现的afterPropertiesSet方法("Bean填充属性后"执行)。
  • 继续执行程序员在Bean上自定义的initMethod方法。
  • BeanPostProcessors进行处理,通过applyBeanPostProcessorsBeforeInitializationapplyBeanPostProcessorsAfterInitialization分别在初始化之前和之后处理各种Bean的后置处理器,包括"负责AOP处理"的AnnotationAwareAspectJAutoProxyCreator、负责"构造后@PostConstruct和销毁前@PreDestroy处理"的InitDestoryAnnotationBeanPostProcessor等系统级处理器以及程序员通过实现BeanPostProcessor接口的自定义处理器。由于处理器过多,可以通过实现PriorityOrdered接口来指定顺序进行逐一处理。
  1. 注册销毁

  • 通过registerDisposableBean方法将实现销毁接口DisposableBean的Bean进行注册,这样在销毁时就可以执行destroy方法了(registerDisposableBean注册可销毁的Bean对象)。

三、添加单例Bean对象(add Singleton)

  • 将这些完整的Bean对对象通过addSingleton方法放入单例池singletonObjects中就可以被获取和使用了。
Bean生产阶段

Bean使用阶段

该阶段可正常使用bean。

Bean销毁阶段

  • 在销毁之前要先执行"销毁前处理器"postProcessBeforeDestruction,这里会执行Bean中添加了@PreDestroy注解的方法。
  • 然后通过destroyBeans方法逐一销毁所有的Bean。
  • 通过"客户销毁方法"invokeCustomDestoryMethod来执行程序员在Bean上自定义的destroyMethod方法。
Bean销毁阶段
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring生命周期包括实例化、配置和销毁三个阶段。首先,实例化阶段是指创建一个Bean的实例。在Spring中,Bean的实例化可以通过使用BeanFactory或ApplicationContext来获取。其次,配置阶段是指对实例化的Bean进行配置,也就是进行IOC注入。在这个阶段,Spring会根据配置文件中的Bean的id值进行相应的配置。如果Bean实现了BeanNameAware接口,Spring还会调用它实现的setBeanName(String)方法,传递的参数就是Bean的id值。最后,销毁阶段是指当Bean不再使用时进行垃圾回收。对于Singleton模式的Bean,Spring会负责管理整个生命周期;而对于Prototype模式的Bean,Spring在创建好并交给使用者后就不再管理后续的生命周期。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [关于Spring Bean的生命周期](https://blog.csdn.net/Apeopl/article/details/82964799)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Springbean生命周期详解](https://blog.csdn.net/qq_64169170/article/details/123052663)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值