天天看點

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>      

繼續閱讀