1. 程式人生 > >spring_(10)IOC容器中Bean的生命週期

spring_(10)IOC容器中Bean的生命週期

  • SpringIOC容器可以管理Bean的生命週期,Spring允許在Bean生命週期的特定點執行定製的任務
  • SpringIOC容器對Bean的生命週期進行管理的過程:
    • 通過構造器或工廠方法建立Bean例項
    • 為Bean的屬性設定值和對其他Bean的引用
    • 呼叫Bean的初始化方法
    • Bean可以使用了
    • 當容器關閉時,呼叫Bean的銷燬方法
  • 在Bean的聲明裡設定 init-method 和 destroy-method 屬性,為 Bean 指定初始化和銷燬方法.

例子程式

基本結構

在這裡插入圖片描述

Car.java

package com.spring.beans.cycle;

public class Car {

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

    private String brand;

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

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

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">
<bean id = "car" class="com.spring.beans.cycle.Car" init-method="init" destroy-method="destroy"> <property name="brand" value="Audi"></property> </bean> </beans>

Main.java

package com.spring.beans.cycle;

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

public class Main {
    public static void main(String[] args){

        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");

        Car car = (Car) ctx.getBean("car");
        System.out.println(car);

        //關閉IOC容器
        ctx.close();
    }
}

執行結果

在這裡插入圖片描述

建立Bean後置處理器

  • Bean後置處理器允許在呼叫初始化方法前後對Bean進行額外的處理
  • Bean後置處理器對IOC容器裡的所有Bean例項逐一處理,而非單一例項.其典型應用是:檢查Bean屬性的正確性或根據特定的標準更改Bean的屬性
  • 對Bean後置處理器而言,需要實現Interface BeanPostProcessor介面。在初始化方法被呼叫前後,Spring將把每個Bean例項分別傳遞給上述介面的以下兩個方法

在這裡插入圖片描述

新增Bean後置處理器後Bean的生命週期

  • SpringIOC容器對Bean的生命週期進行管理的過程:

    • 通過構造器或工廠方法建立Bean例項
    • 為Bean的屬性設定值和對其他Bean的引用
    • 將Bean例項傳遞給Bean後置處理器的postProcessBeforeInitialization方法
    • 呼叫Bean的初始化方法
    • 將Bean例項傳遞給Bean後置處理器的postProcessAfterInitialization方法
    • Bean可以使用了
    • 當容器關閉時,呼叫Bean的銷燬方法

    例子程式

    基本結構

在這裡插入圖片描述

Car.java 同上

MyBeanPostProcessor.java (實現了 BeanPostProcessor 介面

package com.spring.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);

        if("car".equals(beanName)){
            //...
        }

        return bean;
    }

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

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

    <bean id = "car" class="com.spring.beans.cycle.Car"
        init-method="init"
        destroy-method="destroy">
        <property name="brand" value="Audi"></property>
    </bean>

    <!--
         實現BeanPostProcessor介面,並具體提供
         public Object postProcessBeforeInitialization(Object bean, String beanName): init-method 之前被呼叫
         public Object postProcessAfterInitialization(Object bean, String beanName) : init-mrthod 之後被呼叫
         的實現

         bean: bean 例項本身
         beanName: IOC 容器配置的bean的名字
         返回值:是實際上返回給使用者的那個Bean,注意:可以在以上兩個方法中修改返回的bean,甚至返回一個新的bean
    -->

    <!--配置bean的後置處理器: 不需要配置id,IOC容器自動識別是一個BeanPostProcessor-->
    <bean class="com.spring.beans.cycle.MyBeanPostProcessor"></bean>

</beans>

Main.java

package com.spring.beans.cycle;

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

public class Main {
    public static void main(String[] args){

        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");

        Car car = (Car) ctx.getBean("car");
        System.out.println(car);

        //關閉IOC容器
        ctx.close();
    }
}

執行結果

在這裡插入圖片描述