Spring中Bean的生命周期

Spring生命周期与扩展点(图)

Bean的生命周期有两个主要方面,一是生命周期的主要阶段(绿色),一是扩展点(粉色、橘黄色)(用于在生命周期的某个阶段进行自定义扩展)
在这里插入图片描述
 

生命周期

Bean的生命周期本质上就是一系列方法的调用执行,把它划分为四个主要阶段是为了方便我们理解。在Bean被创建完成可供使用前,需要经历实例化、属性赋值、初始化三个重要阶段。当Bean不再需要时,会经过销毁阶段。

  • 实例化 (Instantiation): 由Spring完成,通过反射"new"出Bean对象
  • 属性赋值(Populate): 由Spring完成,对Bean的属性进行依赖注入
  • 初始化(Initialization): 自己实现-通过Bean实现InitializingBean接口AfterPropertiesSet()方法
  • 销毁(Destruction):自己实现-通过Bean实现DisposableBean接口destroy方法
     
     

扩展点(钩子函数)

所谓扩展点(钩子函数),就是一些特定接口内的特定方法,Spring在创建Bean时,执行到某个阶段就会调用这些特定方法,来完成一些自定义的功能。也就是说,扩展点是可选的执行方法如果有这样的方法,就会在响应阶段调用执行,没有也不会影响整个流程。
 

生命周期扩展点

如图中绿色的部分,被本文称作主要阶段,主要阶段中的前两阶段 实例化 (Instantiation)和属性赋值(Populate)是Spring帮我们完成的。主要阶段的后两部分初始化(Initialization)和销毁(Destruction)需要我们自己完成。
 

初始化(Initialization):

两种方式:

  1. 通过Bean实现InitializingBean接口AfterPropertiesSet()方法 或
  2. 在配置文件中指定init-method
<bean name = "yy" class = "yy.yy" init-method="init">
			......
</bean>

销毁(Destruction):
两种方式:

  1. 通过Bean实现DisposableBean接口destroy方法
  2. 在配置文件中指定destroy-method
<bean name = "yy" class = "yy.yy" destroy-method="destroy">
			......
</bean>

 

Aware类型扩展点

Aware类型的接口的作用就是让我们能够拿到Spring容器中的一些资源。基本都能够见名知意,Aware之前的名字就是可以拿到什么资源,例如BeanNameAware接口的setBeanName可以拿到BeanName,以此类推。

xxxAware接口都是在属性赋值阶段之后,初始化阶段开始之前执行。

简单举例:
方法的参数就是我们想拿到的资源,会以参数形式传递进来。

@Component
public class MyBean implements BeanNameAware {
     @Override
     public void setBeanName(String name) {
         System.out.println("MyBeanName-setBeanName:"+name);
     }
 }

 

容器级扩展点

包括了InstantiationAwareBeanPostProcessorBeanPostProcessor这两个接口实现,一般称它们的实现类为“后处理器”。
对于ApplicatonContext(IOC容器)来说,容器可以自动检测并加载BeanPostProcessorBeanFactoryPostProcessor的实现类,它们将影响所有Bean的创建过程。而之前的扩展点(非容器级)只会影响自身Bean的创建过程。

BeanPostProcessor接口
postProcessBeforeInitialization():执行于初始化之前
postProcessAfterInitialization():执行于初始化之后

InstantiationAwareBeanPostProcessor接口
postProcessBeforeInstantiationn():执行于实例化之前
postProcessAfterInstantiation():执行于实例化之后

InstantiationAwareBeanPostProcessor接口继承自BeanPostProcessor接口

 

总结

Spring生命周期分为4个重要阶段 实例化 (Instantiation)、属性赋值(Populate)、初始化(Initialization)、销毁(Destruction)。

其中实例化 (Instantiation)、属性赋值(Populate)是Spring帮我们完成的。
初始化(Initialization)、销毁(Destruction)我们是通过生命周期扩展点自己实现的。

另外还有Aware类型扩展点帮助我们能够拿到Spring容器中的一些资源,它发生在属性赋值之后,初始化之前。

以及容器级扩展点对所有Bean产生影响,InstantiationAwareBeanPostProcessor作用于实例化前后,BeanPostProcessor作用于初始化前后。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值