Spring中的Bean配置 (14)——IOC容器中Bean的生命周期

    Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务. Spring IOC 容器对 Bean 的生命周期进行管理的过程:

—通过构造器或工厂方法创建 Bean 实例

—为 Bean 的属性设置值和对其他 Bean 的引用

—调用 Bean 的初始化方法

—Bean 可以使用了

—当容器关闭时,调用 Bean 的销毁方法

    在 Bean 的声明里设置 init-method 和 destroy-method 属性,为 Bean 指定初始化和销毁方法.

我么还可以创建Bean 后置处理器允许在调用初始化方法前后对Bean进行额外的处理。

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

添加 Bean 后置处理器后Bean的生命周期如下

    Spring IOC 容器对 Bean 的生命周期进行管理的过程:

—通过构造器或工厂方法创建 Bean 实例

—为 Bean 的属性设置值和对其他 Bean 的引用

—将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法

—调用 Bean 的初始化方法

—将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法

—Bean 可以使用了

—当容器关闭时, 调用 Bean 的销毁方法

下面进行代码演示

Person.java

package com.atguigu.spring.bean;

public class Person {
          
   
	
	private String name;

	public void inits() {
          
   
		
		System.out.println("初始化");
		
	}
	
	public void destroys() {
          
   
		
		System.out.println("销毁");
		
	}

	public Person(String name) {
          
   
		
		super();
		this.name = name;
		System.out.println("调用构造函数");
		
	}
	
	public   Person() {
          
   
		
		
	}
		
	@Override
	public String toString() {
          
   
		
		return "Person [name=" + name + "]";
		
	}

}

Person_ImplementsBeanPostProcessor .java

package com.atguigu.spring.bean;

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

public class Person_ImplementsBeanPostProcessor  implements BeanPostProcessor   {
          
   
	
	public Object postProcessAfterInitialization(Object bean ,String beanName) {
          
   
		
		System.out.println("postProcessAfterInitialization"+bean+","+beanName);
		
		return bean;
		
	}
	
  public Object postProcessBeforeInitialization(Object bean ,String beanName) {
          
   
	  
		System.out.println("postProcessBeforeInitialization"+bean+","+beanName);

		return bean;
		
	}

}

application.java

<?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="person1" class="com.atguigu.spring.bean.Person" init-method="inits" destroy-method="destroys">
<constructor-arg value="zlj"></constructor-arg>
</bean>

<!-- 配置bean的后置处理器:不需要id,IOC容器自动识别是一个BeanPostProcessor -->
 <bean class="com.atguigu.spring.bean.Person_ImplementsBeanPostProcessor"></bean>
 
</beans>

Main.java

package com.atguigu.spring.bean;

import java.io.IOException;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
          
   

	public static void main(String[] args) throws IOException{
          
   

		ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("application.xml");
		
		Person person=applicationContext.getBean(Person.class);
		
	   System.out.println(person);
		
		applicationContext.close();
		
	}

}

结果:

经验分享 程序员 微信小程序 职场和发展