简介:

在spring世界中,一切皆为bean,spring是面向bean编程的,bean也可以称为组件,是一个个java对象,多个组件间协调工作完成复杂的业务功能。

所以理解bean的生命周期,方便在每个时期可以执行一些特定的操作是十分重要的。
这里的bean指的是单例bean,原型bean一旦从容器中获取出去生命周期就不归容器管理了。

默认的生命周期:

spring中bean有五个默认的生命周期(顺序由上到下):

  • 实例创建阶段:就是使用构造器进行实例创建的阶段。
  • 依赖注入阶段:也就是属性赋值阶段。
  • 初始化阶段:可以在依赖注入结束后执行指定的初始化方法。
  • 使用阶段:bean正常使用。
  • 销毁阶段:bean从容器中移除或者容器销毁或者关闭时可以执行特性的方法。

demo:

package com.cong.springdemo;

public class Person {
	
	private String name;
	
	private Integer age;

	
	public Person() {
		System.out.println("第一步:创建实例");
	}
	

	public String getName() {
		return name;
	}

	public void setName(String name) {
		System.out.println("第二步:依赖注入阶段");
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "第四步:使用阶段:Person [name=" + name + ", age=" + age + "]";
	}
	
	//初始化方法,会在依赖注入结束后由调用
	public void init() {
		System.out.println("第三步:初始化");
	}

	//销毁方法。会在bean从容器中移除或者容器销毁或者关闭时执行。
	public void destroy() {
		System.out.println("第五步:销毁");
	}
}
<?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">

  <!-- 使用 init-method执行初始化方法 ,使用destroy-method指定销毁方法-->
  <bean id="person1" class="com.cong.springdemo.Person" init-method="init" destroy-method="destroy">
  	 <property name="name" value="Tom"></property>
  	 <property name="age" value="18"></property>
  </bean>
  
   
   
   
 
</beans>

测试:

public class Test {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		Person person = (Person) context.getBean("person1");
		System.out.println(person);
		//关闭容器
		context.close();
		
		
	}
}

执行结果:

springboot类销毁 springbean何时销毁_spring


除了在xml指定初始化方法和销毁方法,还可以让类实现InitializingBean接口并重写初始化方法,实现DisposableBean方法重写销毁方法实现一样的事情。

基于后置处理器BeanPostProcessor的生命周期

可以定义一个后置处理器实现BeanPostProcessor并重写里面的两个方法,可以在bean的默认生命周期中多加两个时期,一个是在依赖注入后,初始化方法执行前,一个是在初始化方法执行后执行。

这就可以实现生命周期的七个时期(顺序由上到下):

  • 实例创建阶段:就是使用构造器进行实例创建的阶段。
  • 依赖注入阶段:也就是属性赋值阶段。
  • 后置处理器实现的时期。
  • 初始化阶段:可以在依赖注入结束后执行指定的初始化方法。
  • 后置处理器实现的时期。
  • 使用阶段:bean正常使用。
  • 销毁阶段:bean从容器中移除或者容器销毁或者关闭时可以执行特性的方法。

demo:

public class MyPostProcess implements BeanPostProcessor{

	//会在bean的初始化方法之后执行
	@Override
	/**
	 * bean:要处理的bean,必须返回这个,供后面的生命周期使用。
	 * beanName:bean id
	 */
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		
		System.out.println("第五步:后置处理器在初始化后执行");
		
		return bean;
	}
	//会在bean的初始化方法之前执行
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("第三步:后置处理器在初始化前执行");
		return bean;
	}

}

public class Person{
	
	private String name;
	
	private Integer age;

	
	public Person() {
		System.out.println("第一步:创建实例");
	}
	

	public String getName() {
		return name;
	}

	public void setName(String name) {
		System.out.println("第二步:依赖注入阶段");
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "第六步:使用阶段:Person [name=" + name + ", age=" + age + "]";
	}
	
	//初始化方法,会在依赖注入结束后由调用
	public void init() {
		System.out.println("第四步:初始化");
	}

	//销毁方法。会在bean从容器中移除或者容器销毁或者关闭时执行。
	public void destroy() {
		System.out.println("第七步:销毁");
	}
}
<?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">
  
  <!-- 使用 init-method执行初始化方法 ,使用destroy-method指定销毁方法-->
  <bean id="person1" class="com.cong.springdemo.Person" init-method="init" destroy-method="destroy">
  	 <property name="name" value="Tom"></property>
  	 <property name="age" value="18"></property>
  </bean>
  
   
   <!-- 后置处理器也要创建实例bean -->
   <bean class="com.cong.springdemo.MyPostProcess"></bean>
   
 
</beans>

测试:

public class Test {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		Person person = (Person) context.getBean("person1");
		System.out.println(person);
		//关闭容器
		context.close();
		
		
	}
}

结果:

springboot类销毁 springbean何时销毁_spring高级_02

**总结:**要了解spring 容器bean的生命周期,使得可以在每个时期做一些特定是事情。