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

Spring Bean初始化和銷毀的三種方式

 更新時(shí)間:2025年11月10日 10:19:16   作者:Javatutouhouduan  
這篇文章介紹了Spring框架中Bean的初始化和銷毀的幾種方式,包括實(shí)現(xiàn)InitializingBean接口、使用@PostConstruct注解、自定義init方法以及實(shí)現(xiàn)DisposableBean接口、使用@PreDestroy注解和自定義銷毀方法,需要的朋友可以參考下

作為一個(gè) Java 程序員 Spring 框架在我們?nèi)粘9ぷ骱兔嬖囍锌芍^必不可少,學(xué)習(xí)和掌握好 Spring 對(duì)我們來說是很有必要的。

今天就給大家介紹一下 Spring 的 Bean 的初始化和銷毀的幾種方式,看看你平時(shí)用的都是哪種。

初始化

由于 Spring Bean 的初始化都是 Spring 容器幫我們處理的,我們這里說的初始化是指在容器幫我們初始化的過程,我們有哪些方式可以進(jìn)行手動(dòng)干預(yù),或者說初始化的時(shí)候如何運(yùn)行我們自己的邏輯。

廢話不多說,我們依次來看下面的幾種方式

實(shí)現(xiàn)InitializingBean接口

我們可以寫一個(gè)類,然后實(shí)現(xiàn) InitializingBean 接口,通過覆蓋其中的 afterPropertiesSet() 方法來實(shí)現(xiàn)我們自己的邏輯,我們寫一個(gè) case 來實(shí)現(xiàn)一下,如下所示

package com.example.demo.service;
 
import org.springframework.beans.factory.InitializingBean;
 
public class InitServiceImpl implements InitializingBean {
  private String name;
  @Override
  public void afterPropertiesSet() throws Exception {
    System.out.println("afterPropertiesSet...");
    this.name = "Java極客技術(shù) afterPropertiesSet";
  }
 
  public String getName() {
    return name;
  }
 
  public void setName(String name) {
    this.name = name;
  }
}
 

實(shí)現(xiàn)的方式很簡(jiǎn)單,直接實(shí)現(xiàn) org.springframework.beans.factory.InitializingBean 這個(gè)接口然后覆蓋 afterPropertiesSet 這個(gè)方法即可,在這個(gè)方法里面,我們就可以執(zhí)行我們需要在初始化時(shí)候就執(zhí)行的代碼。

比如這里我們?cè)诔跏蓟椒ɡ锩嬷苯咏o一個(gè)屬性進(jìn)行賦值,后續(xù)就可以直接使用了,如下所示

package com.example.demo.controller;
 
@RestController
public class HelloController {
 
  @Autowired
  InitServiceImpl initService;
 
  @GetMapping(value = "/hello")
  public String hello(@RequestParam String name) {
    return initService.getName();
  }
}
 

可以看到是可以直接獲取到屬性值的,這個(gè)比較簡(jiǎn)單我們就不贅述了,繼續(xù)看下面兩個(gè)方式。

增加 @PostConstruct 注解

我們繼續(xù)在 InitServiceImpl 類中增加一個(gè)方法,并且在方法上面增加 @PostConstruct 注解,如下所示

  @PostConstruct
  public void postConstruct() {
    System.out.println("postConstruct...");
    this.name = "Java極客技術(shù) postConstruct";
  }

這種寫法比實(shí)現(xiàn)一個(gè)接口要簡(jiǎn)單一點(diǎn),畢竟只要增加一個(gè)注解就行了,而不需要覆蓋接口的方法,不過本質(zhì)上沒什么區(qū)別。

自定義init方法

這種方式也很簡(jiǎn)單,只不過我們做兩個(gè)動(dòng)作,第一個(gè)是在 InitServiceImpl 類中增加一個(gè)自定義的方法,方法內(nèi)容如下,

  public void initMethod() {
    System.out.println("initMethod...");
    this.name = "Java極客技術(shù) initMethod";
  }

然后再寫一個(gè)配置類,在配置類中定義一個(gè)方法,在方法上面增加一個(gè) @Bean 注解,并且賦值一個(gè) init-method 方法,同時(shí)這個(gè)方法需要?jiǎng)?chuàng)建對(duì)象并返回,如下所示

package com.example.demo.service;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class Config {
 
  @Bean(initMethod = "initMethod")
  public InitServiceImpl initServiceImpl() {
    return new InitServiceImpl();
  }
}
 

怎么樣是不是也很簡(jiǎn)單。

小結(jié)

在這里問大家一個(gè)問題,如果我們?cè)谕粋€(gè)類中同時(shí)存在這三種初始化方法,那會(huì)是什么情況呢?

我們來試一下就知道了,通過完整的代碼,我們將三種方式都寫進(jìn)來,然后啟動(dòng)服務(wù)。

package com.example.demo.service;
 
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
 
import javax.annotation.PostConstruct;
 
public class InitServiceImpl implements InitializingBean {
  private String name;
 
  @Override
  public void afterPropertiesSet() throws Exception {
    System.out.println("afterPropertiesSet...");
    this.name = "Java極客技術(shù) afterPropertiesSet";
  }
 
  @PostConstruct
  public void postConstruct() {
    System.out.println("postConstruct...");
    this.name = "Java極客技術(shù) postConstruct";
  }
 
  public void initMethod() {
    System.out.println("initMethod...");
    this.name = "Java極客技術(shù) initMethod";
  }
 
  public String getName() {
    return name;
  }
 
  public void setName(String name) {
    this.name = name;
  }
}
 

可以看到,我們的服務(wù)是正常的啟動(dòng)和運(yùn)行,并且三個(gè)方法都正常的執(zhí)行了,執(zhí)行的順序依次是 postConstruct,afterPropertiesSet,initMethod,那么這里問一下小伙伴們,此時(shí)我們的 name 值是什么呢?

銷毀

既然我們初始化有三種形式,可以很自然的想到銷毀是不是也有三種形式呢?沒錯(cuò),銷毀的三種方法,也是跟上面類似,分別是

  1. 實(shí)現(xiàn) org.springframework.beans.factory.DisposableBean 接口,覆蓋 destroy() 方法;
  2. 自定義一個(gè)方法,在方法上面增加 @PreDestroy 注解;
  3. 在 InitServiceImpl 中增加一個(gè)自定義銷毀方法,然后在配置類中增加 Bean 的 destoryMethod;

相關(guān)的內(nèi)容也比較簡(jiǎn)單,在上面的 InitServiceImpl 和 Config 基礎(chǔ)上只要增加一點(diǎn)點(diǎn)內(nèi)容就好了

public class InitServiceImpl implements InitializingBean, DisposableBean {
 
  public void destroyMethod() throws Exception {
    System.out.println("destroyMethod...");
  }
 
  @Override
  public void destroy() throws Exception {
    System.out.println("destroy...");
  }
 
  @PreDestroy
  public void preDestroy() throws Exception {
    System.out.println("preDestroy...");
  }
}
 
  @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
  public InitServiceImpl initServiceImpl() {
    return new InitServiceImpl();
 
  }

銷毀的三個(gè)方法在執(zhí)行的時(shí)候也是有優(yōu)先級(jí)的,依次是 preDestroy,destroy,destroyMethod。

至此完整的一個(gè)包含三個(gè)初始化和三個(gè)銷毀方法的代碼就完成了,我們來運(yùn)行一下看看整體的流程。

總結(jié)

雖然說 Spring 給我們提供了三種初始化和三種銷毀的方法,不過我們?cè)谌粘5膶懘a中很少會(huì)把三種都寫上,但是對(duì)于這幾種的優(yōu)先級(jí)還是有必要了解的,萬一別人給你挖坑了怎么辦呢?

好了,今天了不起給大家介紹了一下 Spring 的三種初始化和三種銷毀對(duì)象的方式,并且通過示例案例給大家介紹了一下優(yōu)先級(jí),希望對(duì)大家有幫助。

以上就是Spring Bean初始化和銷毀的三種方式的詳細(xì)內(nèi)容,更多關(guān)于Spring Bean初始化和銷毀的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java輕量級(jí)權(quán)限認(rèn)證框架Sa-Token的使用

    Java輕量級(jí)權(quán)限認(rèn)證框架Sa-Token的使用

    Sa-Token是一個(gè)輕量級(jí)Java權(quán)限認(rèn)證框架,本文就詳細(xì)的來介紹一下Java輕量級(jí)權(quán)限認(rèn)證框架Sa-Token的使用,主要解決:登錄認(rèn)證、權(quán)限認(rèn)證、Session會(huì)話、單點(diǎn)登錄、OAuth2.0、微服務(wù)網(wǎng)關(guān)鑒權(quán)等,感興趣的可以了解一下
    2022-03-03
  • Spring Boot集成Kafka的示例代碼

    Spring Boot集成Kafka的示例代碼

    本篇文章主要介紹了Spring Boot集成Kafka的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • 創(chuàng)建動(dòng)態(tài)代理對(duì)象bean,并動(dòng)態(tài)注入到spring容器中的操作

    創(chuàng)建動(dòng)態(tài)代理對(duì)象bean,并動(dòng)態(tài)注入到spring容器中的操作

    這篇文章主要介紹了創(chuàng)建動(dòng)態(tài)代理對(duì)象bean,并動(dòng)態(tài)注入到spring容器中的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Idea如何配置Maven才能優(yōu)先從本地倉(cāng)庫(kù)獲取依賴(親測(cè)方法有效)

    Idea如何配置Maven才能優(yōu)先從本地倉(cāng)庫(kù)獲取依賴(親測(cè)方法有效)

    對(duì)于Idea怎么配置Maven才能優(yōu)先從本地倉(cāng)庫(kù)獲取依賴,網(wǎng)上說法有很多種,都不太靠譜,最終都沒有效果,最好的解決方法是通過修改maven配置文件settings.xml,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • synchronized底層原理之JVM層面的鎖實(shí)現(xiàn)細(xì)節(jié)與流程

    synchronized底層原理之JVM層面的鎖實(shí)現(xiàn)細(xì)節(jié)與流程

    本文從JVM底層視角,詳細(xì)拆解了synchronized的實(shí)現(xiàn)邏輯,涵蓋鎖的存儲(chǔ)載體(對(duì)象頭的MarkWord)、鎖的觸發(fā)指令(monitorenter/monitorexit指令和ACC_SYNCHRONIZED標(biāo)志位)以及鎖的調(diào)度機(jī)制,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Java 使用 FFmpeg 處理視頻文件示例代碼詳解

    Java 使用 FFmpeg 處理視頻文件示例代碼詳解

    這篇文章主要介紹了Java 使用 FFmpeg 處理視頻文件示例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • springboot加載配值文件的實(shí)現(xiàn)步驟

    springboot加載配值文件的實(shí)現(xiàn)步驟

    本文主要介紹了springboot加載配值文件的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Mybatis逆向工程運(yùn)行代碼實(shí)例

    Mybatis逆向工程運(yùn)行代碼實(shí)例

    這篇文章主要介紹了Mybatis逆向工程運(yùn)行代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • MybatisPlus之likeRight的用法

    MybatisPlus之likeRight的用法

    這篇文章主要介紹了MybatisPlus之likeRight的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 在Maven下代理服務(wù)器設(shè)定的方式

    在Maven下代理服務(wù)器設(shè)定的方式

    今天小編就為大家分享一篇關(guān)于在Maven下代理服務(wù)器設(shè)定的方式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評(píng)論

霞浦县| 昭通市| 万宁市| 彭州市| 达拉特旗| 方城县| 呼图壁县| 大邑县| 乡宁县| 巴里| 武鸣县| 富民县| 绥阳县| 泗洪县| 兴和县| 大竹县| 宜兴市| 龙胜| 曲麻莱县| 沅江市| 广河县| 成安县| 琼结县| 宜阳县| 余庆县| 拉孜县| 盐源县| 桂东县| 宣城市| 石景山区| 兴隆县| 新密市| 房山区| 浦江县| 宣汉县| 靖远县| 武鸣县| 宁陕县| 常德市| 汨罗市| 永嘉县|