Bean的生命周期(面试题)

Spring Bean的生命周期主要有四个阶段:

  1. 实例化 -> Instantiation
  2. 属性赋值 -> Populate
  3. 初始化 -> Initialization
  4. 销毁 -> Destruction

实例化和属性赋值对应构造方法和setter方法的注入,初始化和销毁是用户能自定义扩展的两个阶段

Bean定义

spring在启动时,会去扫描在xml/注解/JavaConfig中需要被Spring管理的Bean信息,这些信息会被封装成BeanDefinition,并把这些信息放到BeanDefinitionMap中,这个Map中key是bean的名字,value是BeanDefinition对象

容器启动完成后,会根据BeanDefinition去实例化Bean

实例化

spring中是使用反射来实现的,通过反射选择合适的构造器把对象实例化,这里只是将对象创建出来,对象的具体属性还没有注入,实例化对象被包装在BeanWrapper对象中,BeanWrapper提供了设置对象属性的接口。

属性赋值

实例化后的对象被封装在BeanWrapper对象中,并且此时对象仍是一个原生的状态,并没有属性的依赖注入,Spring会根据BeanDefinition的信息进行依赖注入,并且通过BeanWrapper提供的设置属性的接口完成依赖注入

初始化

首先判断该Bean是否Aware接口,如果存在则填充相关的资源

如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法

如果实现BeanFactory,Spring将调用setBeanFactory()方法将BeanFactory容器实例传入

如果实现ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文传入

BeanPostProcessor

Aware相关的接口处理完之后,就会调用到BeanPostProcessor后置处理器,它有两个处理方法Before和After,

Before会将正在初始化的bean传入,我们就可以对这个Bean进行处理,这个方法先于InitialzationBean执行,被称为前置处理,所有的Aware接口的注入就是在这一步完成的,执行完Aware相关接口后就会执行before的方法

初始化扩展

后置处理器中before的方法执行完毕后就会执行init相关方法,例如@PostConstruct,实现InitializingBean接口,xml中定义的init-method的方法

执行顺序就是:@PostConstruct -> 实现InitializingBean接口 -> xml中定义的init-method的方法

init方法执行完了之后,就会执行BeanPostProcessor的after方法

以上几个步骤完成后,Bean就以经被正确创建了,之后就可以使用这个Bean了

生存期

Bean已经准备就绪,可以被应用程序使用,他们将一直驻留在应用上下文中,直到上下文被销毁

销毁

如果Bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method声明销毁方法,该方法也会被调用。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值