spring中IOC容器中Bean的生命周期方法

  • spring IOC容器可以管理Bean的生命周期,spring允许在Bean生命周期的特定点执行定制的任务

  • spring IOC容器对Bean的生命周期管理的过程

  1. 通过构造器或工厂方法创建Bean实例
  2. 为Bean的属性设置值和对其他Bean的引用
  3. 调用Bean的初始化方法
  4. Bean可以使用了
  5. 当容器关闭是,调用Bean的销毁方法
  • 在Bean的声明里设置init-method和destroy-method属性,为bena初始化和销毁方法

测试如下,添加一个类Car

package cycle;

public class Car
{
	private String brand;
	public Car()
	{
		System.out.println("Car's Constructor...");
	}
	
	public void setBrand(String brand)
	{
		System.out.println("setBrand");
		this.brand = brand;
	}
	
	public void init()
	{
		System.out.println("init..");
	}
	public void destroy()
	{
		System.out.println("destroy..");
	}
	
}

添加配置 

<bean id="car" class="cycle.Car"
	init-method="init"
	destroy-method="destroy">
	<property name="brand" value="Audi"></property>
</bean>

获取bean,运行获得结果

可以看到,先调用了类的构造方法,然后读取配置调用了类的set方法,然后调用了init方法,然后返回了这个Bean,最后在容器关闭的时候调用了destroy方法

 

实际上可以更细腻的定制Bean的生命周期方法,spring提供了一个Bean后置处理器

  • Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理
  • Bean后置处理器对IOC容器里的所有Bean实例逐一处理,而非单一实例,其典型应用是:检查Bean属性的正确性或根据特定的标准更改Bean的属性
  • 对Bean后置处理器而言,需要实现Interface BeanPostProcessor接口,在初始化方法被调用前后,spring将把每个Bean实例分别传递给上述接口以下的两个方法

添加Bean后置处理器后IOC容器对Bean的声明周期进行管理的过程:

  • 通过构造器或工厂方法创建Bean实例
  • 为Bean的属性设置值和对其他Bean的引用
  • 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法
  • 调用Bean的初始化方法
  • 将Bean实例传递Bean后置处理器的postProcessAfterInitialization方法
  • Bean可以使用了
  • 当容器关闭是,调用Bean的销毁方法

添加一个类MyBeanPostProcessor

package cycle;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor
{

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
	{
		// TODO Auto-generated method stub
		System.out.println("postProcessAfterInitialization" + bean + "," +beanName);
		return bean;
	}

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
	{
		// TODO Auto-generated method stub
		System.out.println("postProcessBeforeInitialization" + bean + "," +beanName);
		return bean;
	}

}

添加对应的配置

<!-- 配置bean的后置处理器 -->
<!-- 不需要配置id,IOC容器会自动识别是一个BeanPostProcessor -->
<bean class="cycle.MyBeanPostProcessor">
</bean>

获取bean运行后得到结果

可以看到,Bean后置处理器还是很强大的,可以实现BeanPostProcessor接口,并具体提供Object postProcessBeforeInitialization(Object bean,String beanName)(init-method之前被调用)和Object postProcessAfterInitialization(Object bean,String beanName)(init-method之后被调用)方法。

bean:bean实例本身

beanName:IOC容器配置的bean的名字

返回值:是实际上返回给用户的那个Bean,注意:可以在以上两个方法中修改返回的Bean,甚至返回一个新的Bean

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值