默认情况下,Spring在读取xml文件的时候,就会创建对象。在创建对象的过程是:先调用构造器,然后有属性值调用set方法设置属性,然后调用init-method属性值中所指定的初始化方法。对象在被销毁的时候,会调用destroy-method属性值中所指定的销毁方法,写一个测试类,代码如下:

测试 bean

public class LifeBean {
	private String name;
	
	public LifeBean() {
		System.out.println("LifeBean 的无参构造函数");
	}
	
	public void setName(String name) {
		System.out.println("setName 方法");
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	public void init() {
		System.out.println("This is init of lifeBean");
	}
	
	public void destory() {
		System.out.println("This is destory of lifeBean");
	}
}

applicationContext.xml

<bean id="lifeBean" class="www.xq.spring.bean.LifeBean" 
            init-method="init" destroy-method="destory">
		<property name="name" value="lifeBean"></property>
</bean>

测试

@Test
	public void testLifeBean() {
		AbstractApplicationContext ctx = 
				new ClassPathXmlApplicationContext("applicationContext.xml");
		LifeBean lifeBean = (LifeBean) ctx.getBean("lifeBean");
		System.out.println(lifeBean);
		
		//销毁 bean
		ctx.close();
	}

运行结果:

LifeBean 的无参构造函数
setName 方法
This is init of lifeBean
[email protected]
This is destory of lifeBean

测试中,我们可以看spring中的bean的简单生命周期,实际上它的完整生命周期要复杂一些:

Spring 学习笔记(五)- bean 的生命周期
Spring 学习笔记(五)- bean 的生命周期

我们这里对BeanPostProcessor接口,做一个实现类,演示一下这些接口如果要在项目中自定义的话应该怎么用,生命周期的前后置处理方法的执行情况:

public class MyBeanPostProcessor implements BeanPostProcessor{
	
	/**
	 * 在初始化方法之前调用,前置处理
	 * bean:第一步实例化的 bean 本身
	 * beanName:bean 在配置文件中的 id,也是 bean 在 IOC 容器中的名字
	 * return:需要返回前面的 bean,但是我们可以在返回之前,偷梁换柱,
	 * 又点像 javaweb 中的拦截器的作用
	 */
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("前置处理的 beanName" + beanName);
		return bean;
	}
	
	/**
	 * 在初始方法之后调用,后置处理
	 */
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("前置处理的 beanName" + beanName);
		return bean;
	}
}

applicationContext.xml

<!-- 配置 BeanPostProcessor 的实现类,不用 id,Spring 容器会自动识别 -->
	<bean class="www.xq.spring.bean.MyBeanPostProcessor"></bean>

运行结果:

Spring 学习笔记(五)- bean 的生命周期

以上就是 Bean 在 Spring 容器中从创建到销毁的整个生命周期!

相关文章:

  • 2022-03-01
  • 2022-01-16
  • 2021-08-12
  • 2022-01-02
  • 2021-09-24
  • 2021-08-23
  • 2021-10-15
  • 2021-11-20
猜你喜欢
  • 2022-01-04
  • 2021-04-16
  • 2021-10-22
  • 2022-12-23
  • 2022-02-06
  • 2022-03-10
  • 2021-10-15
相关资源
相似解决方案