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,这其中包含了一系列关键点。

Spring 生命周期_spring

若容器注册了以上各种接口,程序那么将会按照以上的流程进行。

各种接口方法分类

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 生命周期_spring_02 接口. 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:

Spring 生命周期_生命周期_03

注意:

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>