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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值