1. 程式人生 > >Spring03——bean的生命週期及作用域

Spring03——bean的生命週期及作用域

1. 預設情況下, IOC 容器中的 bean 是單例的! 若物件是單例的, 則在建立 IOC 容器時即建立 bean 的例項, 並對 bean 的屬性進行初始化. 
2. 可以通過 bean 的 scope 屬性來修改 bean 的作用域. 若取值為 prototype, 則 bean 為原型的: 每次向容器獲取例項, 得到的都是一個新的物件.
而且, 不在建立 IOC 容器時建立 bean 的例項了. 

1.建立實體的建構函式和set方法,並新增輸出

2.bean的配置檔案:

 <bean id="user" class="com.wj.spring.entityLive.User" p:userNam="bxklk" scope="singleton"></bean>

通常,預設情況下bean都是單例的

3.main方法:

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
        User user1 = (User) ctx.getBean("user");
        User user2 = (User) ctx.getBean("user");
        System.out.println(user1==user2);
    }
}

通過user1==user2 來判斷是否是兩個同樣的物件

輸出:

構造方法和set方法都只調用一次,且user1==user2

 

若更改scope=protype

輸出結果,兩個次呼叫建構函式和set方法,user1!=user2

 

其他的作用域:

 

二.關於bean的生命週期,在user實體中新增 init(初始化)和destroy(銷燬)兩個方法,名字可以隨便起,這裡只是為了便於記憶。

1.配置xml,新增兩個屬性:

1 一般地, 討論 bean 的生命週期, 是建立在 bean 是單例的基礎上的. 
2 可以為 bean 指定 init 和 destroy 方法

 

2.main方法如下:新增ctx.close(),銷燬ioc容器

3.輸出

 

三.面試題常問的bean的後置處理器如何健全bean的生命週期操作:

bean的後置處理器允許在呼叫bean的init方法前後對bean進行額外處理,比如檢查bean的準確性。

實現順序:

1.呼叫bean的構造方法

2.為bean的屬性設值

3.將bean的例項傳給後置處理器中的postProcessBeforeInitalization方法

4.呼叫bean的初始化方法(init)

5.將bean的例項傳遞給bean的後置處理器中的postProcessAfterInitalization方法

6使用bean

7.在ioc銷燬時呼叫bean的destory方法

 

 

1.首先建立後置處理器

通過實現BeanPostPrcessor 並實現postProcessBeforeInitialization  以及 postProcessAfterInitialization 方法,這裡輸出bean以及beanName

package com.wj.spring.entityLive;

import org.springframework.beans.BeansException;

/**
 * @Author: wj
 * @Date: 2018/11/19 12:25
 * @Version 1.0
 */
public class BeanPostProcessor implements org.springframework.beans.factory.config.BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization:"+bean+",beanName:"+beanName);
        return bean;
    }

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

2.在xml中配置bean的後置處理器:

3.輸出:

輸出結果與前面的順序相吻合,呼叫構造器,set方法,beafore、init、after

4.拓展一下後置處理器的返回:

更改 BeanPostProcessor類,令其返回新建的User實體類

輸出結果如下:

可以將本次輸出與上次做一下對比