Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务。
Spring IOC 容器对 Bean 的生命周期进行管理的过程:
1、通过构造器或工厂方法创建 Bean 实例
2、为 Bean 的属性设置值和对其他 Bean 的引用
3、调用 Bean 的初始化方法
4、Bean 可以使用了
5、当容器关闭时, 调用 Bean 的销毁方法
在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法。
生命周期流程图
Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,这其中包含了一系列关键点。
若容器注册了以上各种接口,程序那么将会按照以上的流程进行。
各种接口方法分类
Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:
Bean自身的方法
这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法
package com.spring.auto.autowire;
public class ShengMing {
private String name;
private String pass;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getPass() {
return pass;
}
public void init(){
System.out.println("开始");
}
public void destroy(){
System.out.println("结束");
}
}
package com.spring.auto.autowire;
import com.mchange.v2.c3p0.DataSources;
import com.spring.beans.DataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.*;
public class Test {
public static void main(String[] args) throws SQLException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/spring/auto/autowire/spring_autowire.xml");
ShengMing shengMing = (ShengMing) applicationContext.getBean("shengming");
System.out.println(shengMing.getName());
System.out.println(shengMing);
((ClassPathXmlApplicationContext) applicationContext).close();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="shengming" class="com.spring.auto.autowire.ShengMing" init-method="init" destroy-method="destroy">
<property name="name" value="生命"></property>
<property name="pass" value="123456"></property>
</bean>
</beans>
Bean级生命周期接口方法
这个包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法
package com.spring.auto.autowire;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
public class ShengMing implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {
private String name;
private String pass;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getPass() {
return pass;
}
public void init(){
System.out.println("开始");
}
public void destroy(){
System.out.println("结束");
}
@Override
public void setBeanName(String name) {
}
@Override
public void afterPropertiesSet() throws Exception {
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
}
}
package com.spring.auto.autowire;
import com.mchange.v2.c3p0.DataSources;
import com.spring.beans.DataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.*;
public class Test {
public static void main(String[] args) throws SQLException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/spring/auto/autowire/spring_autowire.xml");
((ClassPathXmlApplicationContext) applicationContext).close();
}
}
<bean id="shengming2" class="com.spring.auto.autowire.ShengMing"></bean>
容器级生命周期接口方法
包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后置处理器”。
Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理. Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性. 对Bean 后置处理器而言, 需要实现 接口. 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:
注意:
1、BeanPostProcessor接口包括2个方法postProcessAfterInitialization和postProcessBeforeInitialization,这个方法默认执行所以配置的bean,可以在这两个方法中设置想要执行的bean,这两个方法的第一个参数都是要处理的Bean对象,第二个参数都是Bean的name,返回值也都是要处理的Bean对象。
2、InstantiationAwareBeanPostProcessor 接口本质是BeanPostProcessor的子接口,一般我们继承Spring为其提供的适配器类InstantiationAwareBeanPostProcessor Adapter来使用它,其中postProcessAfterInitialization方法就是重写了BeanPostProcessor的方法;postProcessPropertyValues方法用来操作属性,返回值也应该是PropertyValues对象。
package com.spring.auto.autowire;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if("shengming".equals(beanName))){
System.out.println("postProcessBeforeInitialization" + bean + " " + beanName);
return bean;
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization" + bean + " " + beanName +" " + beanName);
return bean;
}
}
package com.spring.auto.autowire;
import com.mchange.v2.c3p0.DataSources;
import com.spring.beans.DataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.*;
public class Test {
public static void main(String[] args) throws SQLException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/spring/auto/autowire/spring_autowire.xml");
((ClassPathXmlApplicationContext) applicationContext).close();
}
}
<bean id="shengming" class="com.spring.auto.autowire.ShengMing">
<property name="name" value="生命"></property>
<property name="pass" value="123456"></property>
</bean>
<bean class="com.spring.auto.autowire.MyBeanPostProcessor"></bean>
工厂后处理器接口方法
这个包括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工厂后处理器接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。
package com.spring.auto.autowire;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
public class MyBeanFactoryProcess implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("shengming");
System.out.println(beanDefinition);
}
}
package com.spring.auto.autowire;
import com.mchange.v2.c3p0.DataSources;
import com.spring.beans.DataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.*;
public class Test {
public static void main(String[] args) throws SQLException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/spring/auto/autowire/spring_autowire.xml");
((ClassPathXmlApplicationContext) applicationContext).close();
}
}
<bean id="shengming" class="com.spring.auto.autowire.ShengMing">
<property name="name" value="生命"></property>
<property name="pass" value="123456"></property>
</bean>
<bean class="com.spring.auto.autowire.MyBeanFactoryProcess"></bean>