bean生命周期



Bean 的生命周期从Spring容器着手实例化Bean开始,直到最终销毁Bean,这当中经过了许多关键点,每个关键点都涉及特定方法的调用,可以将这些方法大致划分为3类:

一、Bean自身的方法

构造器、属性设置、初始化方法、销毁方法
二、Bean级生命周期接口方法

 BeanNameAWare提供的setBeanName方法
 BeanFactoryAWare提供的setBeanFactory方法
 InitializingBean提供的afterPropertiesSet方法
 DisposableBean提供的destroy方法
三、容器级生命周期接口方法

BeanFactoryPostProcessor 
 InstantiationAwareBeanPostProcessor
 BeanPostProcessor

各方法的执行顺序如下图所示

四、用代码来验证Bean的生命周期

1.新建Bean类继承BeanNameAWare,BeanFactoryAWare,InitializingBean,DisposableBean并重写类的方法

public class Car implements BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean {
	private String brand;
	private String color;
	private Double price;
	public Car(){
		System.out.println("car的构造器");
	}
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		System.out.println("对brad属性进行赋值brand="+brand);
		this.brand = brand;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		System.out.println("对color属性进行赋值color="+color);
		this.color = color;
	}
	public Double getPrice() {
		return price;
	}
	public void setPrice(Double price) {
		System.out.println("对price属性进行赋值price="+price);
		this.price = price;
	}
	public void initMethod(){
		System.out.println("initMethod");
	}
	public void  destroyMethod(){
		System.out.println("destroyMethod");
	}
	
	public void setBeanName(String beanId) {
		// TODO Auto-generated method stub
		System.out.println(beanId);
	}
	//获取IOC容器
	public void setBeanFactory(BeanFactory factory) throws BeansException {
		System.out.println(factory);
		
	}
	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("afterPropertiesSet");
		
	}
	@Override
	public void destroy() throws Exception {
		System.out.println("destroy");
		
	}
}

2.新建另一个bean类让其实现容器级别的接口方法

//容器级别的生命周期方法
//不依赖于某一个bean
public class MyBeanPostProcess  implements BeanPostProcessor{

	@Override//参数一:bean对象,参数二:bean的id
	public Object postProcessAfterInitialization(Object bean, String beanId) throws BeansException {
		System.out.println("postProcessAfterInitialization");
		return bean;
	}

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanId) throws BeansException {
		System.out.println("postProcessBeforeInitialization");
		return bean;
	} 

}

3.在xml文件中对这两个类进行注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="car" class="com.gec.bean.Car" init-method="initMethod" destroy-method="destroyMethod">
	<property name="brand" value="红旗"></property>
	<property name="color" value="红色"></property>
	<property name="price" value="200.00"></property>
</bean>
<bean id="a" class="com.gec.bean.A"></bean>
<bean id="myBeanPost" class="com.gec.processor.MyBeanPostProcess"></bean>
</beans>

4.编写测试类查看输出结果

public class Test {
	public static void main(String[] args) {
		ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
		
		//尝试把IOC容器关闭即销毁
		((ClassPathXmlApplicationContext)ctx).registerShutdownHook();
	}
}


输出结果如下所示






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值