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

Spring干預(yù)Bean的生命周期的方法詳解

 更新時(shí)間:2025年07月08日 08:27:26   作者:冰糖心書房  
Spring 提供了多種機(jī)制讓我們能夠在 Bean 生命周期的不同節(jié)點(diǎn)“插入”自己的邏輯,這些機(jī)制可以分為兩大類:針對單個(gè) Bean 的干預(yù)和針對所有/多個(gè) Bean 的全局干預(yù),本文將通過代碼示例給大家詳細(xì)的介紹一下,需要的朋友可以參考下

Spring 提供了多種機(jī)制讓我們能夠在 Bean 生命周期的不同節(jié)點(diǎn)“插入”自己的邏輯,這些機(jī)制可以分為兩大類:針對單個(gè) Bean 的干預(yù)針對所有/多個(gè) Bean 的全局干預(yù)。

一、 針對單個(gè) Bean 的干預(yù)(最常用)

這些方法讓你為一個(gè)特定的 Bean 類定義其初始化和銷毀邏輯。

1. 使用 JSR-250 注解(推薦方式)

這是現(xiàn)在最優(yōu)雅、也是 Spring 官方推薦的方式。它使用 Java 的標(biāo)準(zhǔn)注解,與 Spring 框架解耦。

  • @PostConstruct:在依賴注入完成之后,執(zhí)行任何自定義的初始化邏輯??梢园阉醋魇?Bean 的“構(gòu)造函數(shù)完成后的補(bǔ)充構(gòu)造函數(shù)”。
  • @PreDestroy:在容器銷毀 Bean 之前,執(zhí)行清理工作。

示例:

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Service
public class DataProcessor {

    @Autowired
    private DataSource dataSource; // 依賴會(huì)被先注入

    private Connection connection;

    public DataProcessor() {
        System.out.println("1. 調(diào)用構(gòu)造函數(shù): dataSource is null? " + (dataSource == null));
    }

    @PostConstruct
    public void openConnection() {
        System.out.println("3. 執(zhí)行 @PostConstruct: dataSource is null? " + (dataSource == null));
        System.out.println("正在打開數(shù)據(jù)庫連接...");
        // 此時(shí) dataSource 已經(jīng)被注入,可以安全使用
        // this.connection = dataSource.getConnection(); 
    }

    public void process() {
        System.out.println("正在處理數(shù)據(jù)...");
    }

    @PreDestroy
    public void closeConnection() {
        System.out.println("執(zhí)行 @PreDestroy: 正在關(guān)閉數(shù)據(jù)庫連接...");
        // if (this.connection != null) this.connection.close();
    }
}

優(yōu)點(diǎn):代碼簡潔,與 Spring 解耦,符合 Java EE 規(guī)范。

2. 實(shí)現(xiàn) Spring 的特定接口

這是 Spring 早期提供的方式,需要你的 Bean 類實(shí)現(xiàn) Spring 框架的接口。

  • InitializingBean:實(shí)現(xiàn)它的 afterPropertiesSet() 方法,效果同 @PostConstruct。
  • DisposableBean:實(shí)現(xiàn)它的 destroy() 方法,效果同 @PreDestroy

示例:

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.DisposableBean;

@Component
public class LegacyService implements InitializingBean, DisposableBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("執(zhí)行 InitializingBean.afterPropertiesSet()");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("執(zhí)行 DisposableBean.destroy()");
    }
}

缺點(diǎn):代碼與 Spring 框架產(chǎn)生了強(qiáng)耦合,不推薦在新代碼中使用。

3. 在配置中指定 init-method 和 destroy-method

這種方式完全將生命周期邏輯的調(diào)用與 Bean 類本身解耦。適用于你無法修改其源代碼的第三方庫 Bean。

XML 配置:

<bean id="myService" class="com.example.MyService" 
      init-method="customInit" 
      destroy-method="customCleanup"/>

Java 配置:

@Configuration
public class AppConfig {
    @Bean(initMethod = "customInit", destroyMethod = "customCleanup")
    public MyService myService() {
        return new MyService();
    }
}

優(yōu)點(diǎn):對類代碼無侵入。

三者執(zhí)行順序@PostConstruct -> InitializingBean.afterPropertiesSet() -> init-method。

二、 針對所有/多個(gè) Bean 的全局干預(yù)(高級/框架級)

這些機(jī)制是 Spring 框架的強(qiáng)大武器,允許你對容器中所有(或部分)Bean 的生命周期進(jìn)行統(tǒng)一的、批量的處理。

1. BeanPostProcessor(Bean 后置處理器)

這是最重要、最強(qiáng)大的全局干預(yù)接口。它像一個(gè)“質(zhì)檢員”,容器中每一個(gè) Bean 在初始化前后都會(huì)經(jīng)過它進(jìn)行“檢查”和“加工”。

它有兩個(gè)核心方法:

  • postProcessBeforeInitialization(Object bean, String beanName):在任何 Bean 的初始化方法(如 @PostConstruct調(diào)用前執(zhí)行。
  • postProcessAfterInitialization(Object bean, String beanName):在任何 Bean 的初始化方法調(diào)用后執(zhí)行。

Spring 的 AOP(如 @Transactional)就是通過 BeanPostProcessor 實(shí)現(xiàn)的。它在 postProcessAfterInitialization 階段檢查 Bean,如果發(fā)現(xiàn)需要代理,就返回一個(gè)代理對象來替換原始的 Bean 實(shí)例。

示例: 創(chuàng)建一個(gè)打印所有 Bean 初始化信息的后置處理器。

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("質(zhì)檢員[Before]: 正在檢查 " + beanName);
        return bean; // 必須返回 bean,否則后續(xù)流程拿不到對象
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("質(zhì)檢員[After]: " + beanName + " 已完成初始化。");
        // 這里可以返回原始 bean,也可以返回一個(gè)包裝后的代理 bean
        return bean;
    }
}

2. Aware 系列接口

Aware 接口的作用是讓 Bean 能夠“感知”并獲取到它所在的容器環(huán)境資源。這發(fā)生在依賴注入之后,自定義初始化方法之前

  • BeanNameAware:讓 Bean 知道它在容器中的 ID。
  • BeanFactoryAware:讓 Bean 獲取到創(chuàng)建它的 BeanFactory,從而可以編程方式地獲取其他 Bean。
  • ApplicationContextAware:功能同上,但獲取的是功能更強(qiáng)大的 ApplicationContext

示例:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class AwareService implements ApplicationContextAware {

    private ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("AwareService 感知到了 ApplicationContext");
        this.context = applicationContext;
    }
    
    public void doSomething() {
        // 可以通過 context 手動(dòng)獲取其他 bean
        DataProcessor processor = context.getBean(DataProcessor.class);
        processor.process();
    }
}

注意:過度使用 Aware 接口會(huì)增加代碼與 Spring 容器的耦合度,應(yīng)謹(jǐn)慎使用。

總結(jié)

干預(yù)方式作用階段影響范圍推薦度/適用場景
@PostConstruct / @PreDestroy初始化后 / 銷毀前單個(gè) Bean強(qiáng)烈推薦,代碼清晰,與框架解耦。
InitializingBean / DisposableBean初始化后 / 銷毀前單個(gè) Bean不推薦,與 Spring 強(qiáng)耦合,用于兼容老代碼。
init-method / destroy-method初始化后 / 銷毀前單個(gè) Bean推薦,用于無法修改源碼的第三方 Bean。
BeanPostProcessor初始化前后所有 Bean高級/框架級。用于實(shí)現(xiàn) AOP、自定義注解處理等全局邏輯。
Aware 接口初始化前單個(gè) Bean謹(jǐn)慎使用。當(dāng) Bean 需要主動(dòng)與容器交互時(shí)使用。

簡單來說,作為應(yīng)用開發(fā)者,你的首選和絕大多數(shù)情況下的選擇應(yīng)該是 @PostConstruct@PreDestroy 如果你需要開發(fā)框架級別的功能,那么 BeanPostProcessor 則是你的核武器。

以上就是Spring干預(yù)Bean的生命周期的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring干預(yù)Bean生命周期的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何解決redisTemplate注入為空問題

    如何解決redisTemplate注入為空問題

    這篇文章主要介紹了如何解決redisTemplate注入為空問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java中防止SQL注入和XSS攻擊的處理指南

    Java中防止SQL注入和XSS攻擊的處理指南

    在當(dāng)今互聯(lián)網(wǎng)時(shí)代,Web應(yīng)用安全已成為開發(fā)者必須重視的核心問題,SQL注入和XSS攻擊作為OWASP?Top?10中的常見威脅,本文將深入探討這兩種攻擊方式的原理,并提供Java開發(fā)中的實(shí)用防護(hù)方案
    2025-10-10
  • Java如何使用Query動(dòng)態(tài)拼接SQL詳解

    Java如何使用Query動(dòng)態(tài)拼接SQL詳解

    這篇文章主要給大家介紹了關(guān)于Java如何使用Query動(dòng)態(tài)拼接SQL的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • SpringBoot通過Filter實(shí)現(xiàn)整個(gè)項(xiàng)目接口的SQL注入攔截詳解

    SpringBoot通過Filter實(shí)現(xiàn)整個(gè)項(xiàng)目接口的SQL注入攔截詳解

    這篇文章主要介紹了SpringBoot通過Filter實(shí)現(xiàn)整個(gè)項(xiàng)目接口的SQL注入攔截詳解,SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,在客戶端在向服務(wù)器發(fā)送請求的時(shí)候,sql命令通過表單提交或者url字符串拼接傳遞到后臺持久層,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令,需要的朋友可以參考下
    2023-12-12
  • JAVA對象分析之偏向鎖、輕量級鎖、重量級鎖升級過程

    JAVA對象分析之偏向鎖、輕量級鎖、重量級鎖升級過程

    這篇文章主要介紹了JAVA對象分析之偏向鎖、輕量級鎖、重量級鎖升級過程,又對這方面感興趣的同學(xué)可以跟著一起研究下
    2021-02-02
  • Java線程優(yōu)先級示例代碼

    Java線程優(yōu)先級示例代碼

    使用過Bit下載軟件的同學(xué)應(yīng)該很清楚,我們有多個(gè)下載任務(wù)同時(shí)執(zhí)行,而其中的某一個(gè)或多個(gè)是非常重要的,于是給這些任務(wù)設(shè)定一個(gè)高度優(yōu)先,以便任務(wù)可以獲取更多的帶寬盡早完成下載
    2013-09-09
  • Spring注入bean的四種方式總結(jié)

    Spring注入bean的四種方式總結(jié)

    我們談到Spring的時(shí)候一定會(huì)提到IOC容器、DI依賴注入,Spring通過將一個(gè)個(gè)類標(biāo)注為Bean的方法注入到IOC容器中,達(dá)到了控制反轉(zhuǎn)的效果,Spring幫我們實(shí)現(xiàn)了一種通過注解來實(shí)現(xiàn)注入的方法,所以本文為大家介紹了Spring注入bean的四種方式,需要的朋友可以參考下
    2025-11-11
  • 詳解Java中的final關(guān)鍵字

    詳解Java中的final關(guān)鍵字

    子類可以在父類的基礎(chǔ)上改寫父類內(nèi)容,為了避免這種隨意改寫的情況,Java提供了final 關(guān)鍵字,用于修飾不可改變內(nèi)容。本文就來詳細(xì)說說final關(guān)鍵字的使用,需要的可以參考一下
    2022-10-10
  • Java代碼重構(gòu)的幾種模式詳解

    Java代碼重構(gòu)的幾種模式詳解

    這篇文章詳細(xì)介紹了Java代碼重構(gòu)的幾種模式,有需要的朋友可以參考一下
    2013-10-10
  • Java中的WebSocket與實(shí)時(shí)通信詳解

    Java中的WebSocket與實(shí)時(shí)通信詳解

    本文介紹WebSocket的概念、工作原理及Java中實(shí)現(xiàn)WebSocket的技術(shù)手段,包括JavaAPIforWebSocket(JSR356)和SpringWebSocket,通過實(shí)際應(yīng)用場景(如即時(shí)聊天、實(shí)時(shí)通知、在線游戲)進(jìn)行了詳細(xì)分析,展示了WebSocket在現(xiàn)代Web應(yīng)用中的重要性,感興趣的朋友跟隨小編一起看看吧
    2025-11-11

最新評論

武隆县| 岳池县| 昭苏县| 辛集市| 达尔| 南澳县| 平顺县| 祁门县| 古丈县| 土默特左旗| 佳木斯市| 广元市| 青海省| 林西县| 东山县| 比如县| 乌兰县| 祥云县| 吉隆县| 台江县| 麟游县| 嘉峪关市| 嘉鱼县| 酉阳| 怀来县| 玉屏| 周宁县| 西吉县| 靖西县| 西峡县| 庐江县| 定州市| 左贡县| 通榆县| 肃宁县| 栾川县| 乌海市| 长岭县| 江永县| 黑山县| 道孚县|