最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring中bean生命周期回調方法

 更新時間:2017年07月19日 08:22:58   作者:elim168  
本篇文章主要介紹了詳解Spring中bean生命周期回調方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

生命周期回調方法

對于spring bean來講,我們默認可以指定兩個生命周期回調方法。一個是在ApplicationContext將bean初始化,包括注入對應的依賴后的回調方法;另一個是在ApplicationContext準備銷毀之前的回調方法。要實現(xiàn)這種回調主要有三種方式:實現(xiàn)特定的接口、在XML配置文件中指定回調方法和使用JSR-250標準的注解。

1 實現(xiàn)特定接口

針對bean初始化后的回調和ApplicationContext銷毀前的回調,Spring分別為我們了提供了InitializingBean和DisposableBean接口供用戶實現(xiàn),這樣Spring在需要進行回調時就會調用對應接口提供的回調方法。

1.1 InitializingBean

InitializingBean是用來定義ApplicationContext在完全初始化一個bean以后需要需要回調的方法的,其中只定義了一個afterPropertiesSet()方法。如其名稱所描述的那樣,該方法將在ApplicationContext將一個bean完全初始化,包括將對應的依賴項都注入以后才會被調用。InitializingBean的完全定義如下。

public interface InitializingBean {

 void afterPropertiesSet() throws Exception;

}

由于InitializingBean的afterPropertiesSet()方法會在依賴項都進行注入以后再回調,所以該方法通常會用來檢查必要的依賴注入,以使我們能夠在bean被初始化時就發(fā)現(xiàn)其中的錯誤,而不是在很長時間使用以后才發(fā)現(xiàn)。如果你去看Spring的源碼,你就會發(fā)現(xiàn)源碼中有很多InitializingBean的使用,而且基本都是用來檢查必要的依賴項是否為空的。

public class Hello implements InitializingBean {
 
 private World world;
 
 /**
 * 該方法將在當前bean被完全初始化后被調用
 */
 public void afterPropertiesSet() throws Exception {
 Assert.notNull(world, "world should not be null.");
 }

 public void setWorld(World world) {
 this.world = world;
 }
 
}

9.1.2 DisposableBean

DisposableBean是用來定義在ApplicationContext銷毀之前需要回調的方法的。DisposableBean接口中只定義了一個destroy()方法,在ApplicationContext被銷毀前,Spring將依次調用bean容器中實現(xiàn)了DisposableBean接口的destroy()方法。所以,我們可以通過實現(xiàn)該接口的destroy()方法來達到在ApplicationContext銷毀前釋放某些特定資源的目的。

public interface DisposableBean {

 void destroy() throws Exception;

}

在Spring的源碼中,也有很多實現(xiàn)了DisposableBean接口的類,如我們熟悉的ApplicationContext實現(xiàn)類、SingleConnectionDataSource等。

2 在XML中配置回調方法

在XML配置文件中通過bean元素定義一個bean時,我們可以通過bean元素的init-method屬性和destroy-method屬性來指定當前bean在初始化以后和ApplicationContext銷毀前的回調方法。需要注意的是所指定的回調方法必須是沒有參數的。

通過init-method屬性來指定初始化方法時所對應的方法必須是該bean中所擁有的方法,所以首先我們需要在對應的bean中定義對應的初始化方法,這里假設我們需要在bean中定義一個init()方法作為該bean的初始化方法,那么我們可以對我們的bean進行類似如下定義。

public class Hello {
 
 private World world;
 
 /**
 * 該方法將被用來作為初始化方法,在當前bean被完全初始化后被調用
 */
 public void init() {
 Assert.notNull(world, "world should not be null.");
 }

 public void setWorld(World world) {
 this.world = world;
 }
 
}

接下來就是在XML配置文件中定義該bean時通過init-method屬性定義對應的初始化方法為init()方法,init-method屬性的屬性值就對應初始化方法的名稱,所以我們的bean應該是如下定義。

 <bean name="world" class="com.app.World"/>
 <!-- 通過init-method屬性指定初始化方法名稱 -->
 <bean id="hello" class="com.app.Hello" init-method="init">
 <property name="world" ref="world"/>
 </bean>

init-method和destroy-method的用法和配置等基本上都是一樣的,所以對于使用destroy-method來指定ApplicationContext銷毀前的回調方法的用法就不再贅述了。

如果我們的初始化方法或銷毀方法的名稱大都是一樣的,在通過init-method和destroy-method進行指定的時候我們就沒有必要一個個bean都去指定了,Spring允許我們在最頂級的beans元素上指定默認的初始化后回調方法和銷毀前的回調方法名稱,這樣對于沒有指定init-method或destroy-method的bean將默認將其中default-init-method或default-destroy-method屬性值對應名稱的方法(如果存在的話)視為初始化后的回調方法或銷毀前的回調方法。這是通過default-init-method和default-destroy-method屬性來定義的。

<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"
  default-init-method="init" default-destroy-method="destroy">
 
</beans>

以上表示定義默認的初始化后回調方法名稱為init,默認的銷毀前回調方法名稱為destroy。

當定義了default-init-method或default-destroy-method以后,如果我們的某個bean對應的初始化后回調方法名稱或銷毀前的回調方法名稱與默認定義的不一樣,則我們可以在對應的bean上通過init-method或destroy-method指定該bean自身的回調方法名稱,即bean上定義的回調方法名稱將會比默認定義擁有更高的優(yōu)先級。

3 使用JSR-250標準的注解

關于bean的生命周期回調方法,Spring也會JSR-250標準注解做了支持,即在bean完全初始化后將回調使用@PostConstruct標注的方法,在銷毀ApplicationContext前將回調使用@PreDestroy標注的方法。
針對之前的示例,如果我們現(xiàn)在把定義的bean定義成如下這樣,即沒有在bean上通過init-method和destroy-method指定初始化方法和銷毀方法。

 <bean name="world" class="com.app.World"/>
 <bean id="hello" class="com.app.Hello">
 <property name="world" ref="world"/>
 </bean>

當然,這里也不考慮全局性的init-method和destroy-method方法,如果我們希望在id為“hello”的bean被初始化后回調其中的init()方法,在銷毀前回調其中的destroy()方法,我們就可以通過@PostConstruct和@PreDestroy進行如下定義。

public class Hello {
 
 private World world;
 
 /**
 * 該方法將被用來作為初始化方法,在當前bean被完全初始化后被調用
 */
 @PostConstruct
 public void init() {
 Assert.notNull(world, "world should not be null.");
 }
 
 @PreDestroy
 public void destroy() {
 System.out.println("---------destroy-----------");
 }

 public void setWorld(World world) {
 this.world = world;
 }
 
}

使用JSR-250標準指定初始化后的回調方法以及銷毀前的回調方法時,如果我們希望將多個方法都作為對應的回調方法進行回調,則可以在多個方法上同時使用對應的注解進行標注,Spring將依次執(zhí)行對應的方法。

public class Hello {
 
 private World world;

 @PostConstruct
 public void init() {
 System.out.println("-----------init-------------");
 }
 
 /**
 * 該方法將被用來作為初始化方法,在當前bean被完全初始化后被調用
 */
 @PostConstruct
 public void init2() {
 Assert.notNull(world, "world should not be null.");
 }
 
 @PreDestroy
 public void destroy() {
 System.out.println("------------destroy----------------");
 }
 
 @PreDestroy
 public void destroy2() {
 System.out.println("---------destroy2-----------");
 }

 public void setWorld(World world) {
 this.world = world;
 }
 
}

4 混合使用三種方式

Spring允許我們混合使用上述介紹的三種方式來指定對應的回調方法。當對于同一個bean使用三種方式指定了同一個方法作為初始化后的回調方法或銷毀前的回調方法,則對應的回調方法只會被執(zhí)行一次。然而,當對于同一個bean使用兩種或三種方式指定的回調方法不是同一個方法時,Spring將依次執(zhí)行使用不同的方式指定的回調方法。對于初始化后的回調方法而言,具體規(guī)則如下:

  1. 使用@PostConstruct標注的方法。
  2. 實現(xiàn)InitializingBean接口后的回調方法afterPropertiesSet()方法。
  3. 通過init-method或default-init-method指定的方法。

對于銷毀前的回調方法而言,其規(guī)則是一樣的:

  1. 使用@PreDestroy標注的方法。
  2. 實現(xiàn)DisposableBean接口后的回調方法destroy()方法。
  3. 通過destroy-method或default-destroy-method指定的方法。

(注:本文是基于Spring4.1.0所寫)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • java Date類詳解及使用總結

    java Date類詳解及使用總結

    這篇文章主要介紹了java Date類詳解及使用總結的相關資料,需要的朋友可以參考下
    2017-02-02
  • mybatis plus 開啟sql日志打印的方法小結

    mybatis plus 開啟sql日志打印的方法小結

    Mybatis-Plus(簡稱MP)是一個 Mybatis 的增強工具,在 Mybatis 的基礎上只做增強不做改變,為簡化開發(fā)、提高效率而生。本文重點給大家介紹mybatis plus 開啟sql日志打印的方法小結,感興趣的朋友一起看看吧
    2021-09-09
  • 淺析Java單例設計模式(自寫demo)

    淺析Java單例設計模式(自寫demo)

    Java單例模式是看起來以及用起來簡單的一種設計模式,但是就實現(xiàn)方式以及原理來說,也并不淺顯,下面這篇文章主要給大家詳細介紹了Java中單例模式,需要的朋友可以參考下
    2021-12-12
  • Springboot項目接口限流實現(xiàn)方案

    Springboot項目接口限流實現(xiàn)方案

    這篇文章主要介紹了Springboot項目接口限流實現(xiàn)方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java性能優(yōu)化之代碼緩存優(yōu)化

    java性能優(yōu)化之代碼緩存優(yōu)化

    這篇文章主要介紹了java性能優(yōu)化之代碼緩存優(yōu)化,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • Java垃圾回收之標記壓縮算法詳解

    Java垃圾回收之標記壓縮算法詳解

    今天小編就為大家分享一篇關于Java垃圾回收之標記壓縮算法詳解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • springboot 啟動如何修改application.properties的參數

    springboot 啟動如何修改application.properties的參數

    這篇文章主要介紹了springboot 啟動如何修改application.properties的參數方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java Arrays快速打印數組的數據元素列表案例

    java Arrays快速打印數組的數據元素列表案例

    這篇文章主要介紹了java Arrays快速打印數組的數據元素列表案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Spring Boot如何通過自定義注解實現(xiàn)日志打印詳解

    Spring Boot如何通過自定義注解實現(xiàn)日志打印詳解

    這篇文章主要給大家介紹了關于Spring Boot如何通過自定義注解實現(xiàn)日志打印的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • java的五種數據類型解析

    java的五種數據類型解析

    下面小編就為大家?guī)硪黄猨ava的五種數據類型解析。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05

最新評論

通城县| 九寨沟县| 壶关县| 色达县| 修文县| 和田市| 锡林郭勒盟| 日土县| 名山县| 绵竹市| 治县。| 通辽市| 正镶白旗| 新安县| 如皋市| 荔浦县| 恩平市| 耿马| 永年县| 勃利县| 新建县| 宁蒗| 榆社县| 东乡县| 石河子市| 治县。| 宜州市| 丰镇市| 城市| 偃师市| 溆浦县| 金堂县| 洪泽县| 右玉县| 达日县| 嵊州市| 涟源市| 宁国市| 丹寨县| 黑山县| 永顺县|