Spring Bean 的生命週期和作用域?
Spring Bean 的生命週期
Spring Bean 的生命週期可以分成,創建,使用,銷燬幾個過程。
Spring Bean 創建過程如下:
- 實例化 Bean 對象
- 設置 Bean 屬性
- 通過各種 Aware 接口聲明瞭依賴關係,則會注入 Bean 對容器基礎設施層面的依賴,包括 BeanNameAware 、BeanFactoryAware 和 ApplicationContextAware 分別注入 BeanID ,BeanFactory或者ApplicationContext
- 調用 BeanPostProcessor 的前置初始化方法 postProcessBeforeInitialization
- 如果實現了InitializingBean 接口,會調用 afterPropertiesSet 方法。
- 調用 Bean 自身定義的 init 方法。
- 調用 BeanPostprocessor 的後置初始方法 postProcessAfterInitialization。
- 創建過程完畢。
Spring Bean 的銷燬
Spring Bean 的銷燬過程會依次調用 DisposableBean 的 destroy 方法和 Bean 自身定製的 destroy() 方法。
Spring Bean 作用域
Spring Bean 有五個作用域,最基礎的是如下兩種:
- Singleton ,這是 Spring 的默認作用域,也就是爲每個 IOC 容器創建唯一一個 Bean 實例,也稱爲單例。
- Prototype ,針對每個 getBean 請求,容器會單獨創建一個 Bean 實例。
從 Bean 的特點來看,Prototype 適合有狀態的 Bean ,而Singleton 則更適合無狀態的情況。
Web 容器還支持另外三種作用域
- Request, 每個 HTTP 請求創建單獨的 Bean 實例。
- Session ,很顯然 Bean 實例的作用域是 Session範圍。
- GlobalSession, 用於 Portlet 有單獨的 Session,GlobalSession 提供了一個全局性的 HTTP Session。
Spring 基礎機制
- IOC, 控制反轉(Invension of Control) ,或者叫做依賴注入(Depency Injection),通過這種機制,可以有效的改善模塊之間的緊耦合問題。
從 Bean 創建過程可以看到,它的依賴關係都是由容器負責注入。
spring 注入的四種方式:
- 構造器注入
- setter 方法注入
- 基於註解注入
- AOP,我們是通過切面編程機制,Spring 框架中的事務、日誌、安全、等功能都依賴 AOP 技術。
Spring AOP 關鍵概念
- Aspect , 通常叫做方面,它是跨不同 Java 類層面的橫切行邏輯。在實現形式上,可以是 XML 文件中配置的普通類,也可以是 @Aspect 註解取聲明。在運行時,Spring 框架會創建類似 Advisor 來指代它,其內部包括切入的時機(Pointcut)和動作 (Advide)
- Join Point 它是 Aspect 可以切入的特定點,在 Spring 裏面只有方法可以作爲 Join Point
- Advice ,定義了切面中能夠採取的動作。
BeforeAdvice 和 AfterAdvice 包括他的子類接口是簡單的實現,而 Interceptor 則是所謂的攔截器,用於攔截住方法調用事件,進而採取相應動作,所以 Interceptor 是覆蓋整個方法過程調用的 Advice。通常將攔截器類型的 Advice叫做 Around ,在代碼中使用 @Arround 來標記。aop:around。
PointCut 它負責具體定義 Aspect 被應用在哪些 Joint Point 可以通過指定具體的類名和方法名來實現。
-
Join Point 僅僅是可利用的機會
-
PointCut 是解決切面變成中的 where 問題,讓程序知道哪些機會點可以應用某個切面操作。
-
Advice 則是明確了切面編程中的 what ,也就是做什麼,同時通過指定 Before 、After 或者 Around ,定義了When ,也就是什麼時候做的問題。