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声明销毁方法,该方法也会被调用。

猜你喜欢

转载自blog.csdn.net/qq_45779998/article/details/127922771
今日推荐