天天看点

hualinux spring 3.12:IOC 容器中 Bean 的生命周期方法

目录

​​一、知识点​​

​​二、例子​​

​​2.1 建立一个新的测试类​​

​​2.2 创建XML配置文件​​

​​2.3 运行​​

​​三、创建 Bean 后置处理器​​

​​3.1 知识点​​

​​3.2 相关代码​​

了解一下Bean的生命周期及方法,对开发和维护都是有好处的

一、知识点

  • Spring IOC 容器可以管理 Bean 的生命周期,
  • Spring IOC 容器对 Bean 的生命周期进行管理的过程:
  • 通过构造器或工厂方法创建 Bean 实例
  • 为 Bean 的属性设置值和对其他 Bean 的引用
  • 调用 Bean 的初始化方法
  • Bean 可以使用了
  • 当容器关闭时, 调用 Bean 的销毁方法
  • 在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.

二、例子

这里直接写代码了,因为比较简单

2.1 建立一个新的测试类

src-->com.hualinux.beans.cycle.Car.java

package com.hualinux.beans.cycle;

public class Car {
    private  String brand;

    public Car() {
        System.out.println("Car's Constructor...");
    }

    public void setBrand(String brand) {
        System.out.println("setBrand...");
        this.brand = brand;
    }

    public void init2(){
        System.out.println("init...");
    }

    public void destroy(){
        System.out.println("destroy...");
    }

}      

2.2 创建XML配置文件

src右击-->new-->XML Configuration File-->Spring config-->输入名字“beans-cycle” 

<bean id="car" class="com.hualinux.beans.cycle.Car"
          init-method="init2" destroy-method="destroy">
        <property name="brand" value="宝马"/>
    </bean>      

2.3 运行

src-->com.hualinux.beans.cycle.Main.java

package com.hualinux.beans.cycle;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-cycle.xml");
        Car car= (Car) ctx.getBean("car");
        System.out.println(car);

        //关闭IOC容器
        ((ClassPathXmlApplicationContext) ctx).close();
    }
}      

运行结果为:

Car's Constructor...

setBrand...

init...

com.hualinux.beans.cycle.Car@3967e60c

destroy...

三、创建 Bean 后置处理器

3.1 知识点

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

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

  • Spring IOC 容器对 Bean 的生命周期进行管理的过程:
  • 通过构造器或工厂方法创建 Bean 实例
  • 为 Bean 的属性设置值和对其他 Bean 的引用
  • 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
  • 调用 Bean 的初始化方法
  • 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
  • Bean 可以使用了
  • 当容器关闭时, 调用 Bean 的销毁方法

3.2 相关代码

src-->com.hualinux.beans.cycle.MyBeanPostProcessor.java

package com.hualinux.beans.cycle;

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 {
        System.out.println("postProcessBeforeInitialization:"+bean+","+beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization:"+bean+","+beanName);
        return bean;
    }
}      

beans-cycle.xml配置文件修改如下:

<?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">

    <!--
    实现BeanPostProcessor接口,并具体提供
    Object postProcessBeforeInitialization(Object bean, String beanName):init-method之前被调用
    Object postProcessAfterInitialization(Object bean, String beanName):init-method之后被调用
    实现

    bean:bean实例本身
    beanName:IOC 容器配置的bean的名字
    返回值:是实际上返回给用户的那个bean, 注意:可以在以上两个访求 中修改返回的bean,甚至返回一个新的bean
-->

    <!-- 配置bean的后置处理器-->
    <bean class="com.hualinux.beans.cycle.MyBeanPostProcessor"/>


    <bean id="car" class="com.hualinux.beans.cycle.Car"
          init-method="init2" destroy-method="destroy">
        <property name="brand" value="宝马"/>
    </bean>



</beans>      

继续阅读