快捷搜索:  汽车  科技

spring bean生命周期代码演示(一文详解Spring中Bean的生命周期)

spring bean生命周期代码演示(一文详解Spring中Bean的生命周期)Bean自身的方法 Bean级生命周期方法 容器级的方法(BeanPostProcessor一系列接口) 工厂后处理器方法(BeanFactoryProcessor一系列接口) Bean自身的方法和Bean级生命周期方法都只对 当前Bean 起作用,但是容器级生命周期方法和工厂后处理器方法是对 所有的bean 都起作用对于如上这些方法,我们可以分成如下几类在不同的容器中,Bean的生命周期开始的时间不同。对于ApplicationContext来说,当容器启动的时候,bean就已经实例化了。而对于BeanFactory来说,直到调用 getBean() 方法的时候才进行实例化。我们知道对于普通的java对象来说,它们的生命周期就是但是对于Bean来说却不是这样。Bean的生命周期如下图所示

在Spring中,Bean是最基础的对象,一切操作都是围绕Bean展开的。Spring是一个BOP(Bean Oriented Programming)框架,Bean在BOP中的作用就像是对象在OOP中的作用一样。既然如此重要,那么我们首先需要了解到底什么是Bean?

什么是Bean

首先,我们来看看Spring官方文档对于Bean的定义:

In Spring the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated assembled and otherwise managed by a Spring IoC container. Otherwise a bean is simply one of many objects in your application

从上面可知,我们可以给Bean下一个定义: Bean就是由IOC实例化、组装、管理的一个对象 。

Bean的生命周期

我们需要明确的是,在这里我们的Bean的生命周期主要指的是 singleton bean ,对prototype bean来说,当用户getBean获得prototype bean的实例后,IOC容器就不再对当前实例进行管理,而是把管理权交由用户,此后再getBean生成的是新的实例。对于request/session/application/websocket 这几种scope的bean我们在此不谈。

在不同的容器中,Bean的生命周期开始的时间不同。对于ApplicationContext来说,当容器启动的时候,bean就已经实例化了。而对于BeanFactory来说,直到调用 getBean() 方法的时候才进行实例化。

我们知道对于普通的java对象来说,它们的生命周期就是

  • 实例化
  • 不再使用的时候通过垃圾回收机制进行回收

但是对于Bean来说却不是这样。Bean的生命周期如下图所示

spring bean生命周期代码演示(一文详解Spring中Bean的生命周期)(1)

对于如上这些方法,我们可以分成如下几类

Bean自身的方法 Bean级生命周期方法 容器级的方法(BeanPostProcessor一系列接口) 工厂后处理器方法(BeanFactoryProcessor一系列接口)

Bean自身的方法和Bean级生命周期方法都只对 当前Bean 起作用,但是容器级生命周期方法和工厂后处理器方法是对 所有的bean 都起作用

对于这几类方法,1 2 4都很好理解,下面我们重点来说一下什么是BeanPostProcessor和BeanFactoryPostProcessor

以我个人理解来说,BeanPostProcessor和BeanFactoryPostProcessor就是 Spring创建的扩展点 ,用户可以创建自己的实现类来修改Bean或者BeanFactory

注意对于ApplicatonContext来说,容器可以 自动检测并加载 BeanPostProcessor和BeanFactoryPostProcessor,但是BeanFactory不行,需要自己调用方法 手动注册 。BeanPostProcessor和BeanFactoryPostProcessor都可以有多个。

ApplicationContext也可以根据org.springframework.core.PriorityOrdered和org.springframework.core.Ordered来进行 自定义排序 ,但是BeanFactory不可以,默认顺序就是 注册顺序 。

这里我需要说明下面两个容易混淆的单词:

  • Instantiation :实例化,指的是调用 构造函数 进行实例化
  • Initialization :初始化,在Bean的声明周期中指的是 init-method 所指定的方法或者是 InitializingBean.afterPropertiesSet() 方法

下面我们对常用的这些接口进行说明:

常用接口说明

  1. BeanNameAware该接口只有一个方法setBeanName(String name),用来获取bean的 id或者name
  2. BeanFactoryAware该接口只有一个方法setBeanFactory(BeanFactory beanFactory),用来获取 当前环境中的BeanFactory
  3. ApplicationContextAware该接口只有一个方法setApplicationContext(ApplicationContext applicationContext),用来获取 当前环境中的ApplicationContext获取到IOC容器之后,可以对beans进行修改等操作
  4. InitializingBean该接口只有一个方法afterPropertiesSet(),在属性注入完成后调用
  5. DisposableBean该接口只有一个方法destroy(),在容器销毁的时候调用,在用户指定的destroy-method之前调用
  6. BeanPostProcessor该接口有两个方法:

初始化之前 初始化之后

通过方法签名我们可以知道,我们可以通过beanName来筛选出我们需要进行个性化定制的bean

  1. InstantiationAwareBeanPostProcessor该类是BeanPostProcessor的子接口,常用的有如下三个方法

实例化之前 实例化之后、设置属性前 实例化之后

测试Bean生命周期

下面我们来编写一个实例来验证我们上面所说的Bean生命周期

首先,我们新建一个User,这个Bean实现了我们的BeanNameAware、ApplicationContextAware、InitializingBean、DisposableBean接口

spring bean生命周期代码演示(一文详解Spring中Bean的生命周期)(2)

然后我们实现我们自己的BeanPostProcessor

spring bean生命周期代码演示(一文详解Spring中Bean的生命周期)(3)

实现自己的InstantiationAwareBeanPostProcessor

spring bean生命周期代码演示(一文详解Spring中Bean的生命周期)(4)

xml配置文件如下

<context:component-scan base-package="com.xiaohuan.springtest"/> <bean id="user" class="com.xiaohuan.springtest.beanlifecycle.User" init-method="myInit" destroy-method="myDestroy"> <!-- 构造函数注入 --> <constructor-arg index="0" type="int"> <value>1</value> </constructor-arg> <constructor-arg index="1" type="java.lang.String"> <value>xiaohuan</value> </constructor-arg> <!-- setter方法注入 --> <property name="id" value="2"/> <property name="name" value="dahuan"/> </bean> 复制代码

编写我们自己的测试类

spring bean生命周期代码演示(一文详解Spring中Bean的生命周期)(5)

最后运行项目

spring bean生命周期代码演示(一文详解Spring中Bean的生命周期)(6)

猜您喜欢: