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實體類
輸出結果如下:
可以將本次輸出與上次做一下對比