深入理解Spring應用中的初始化和清理代碼執行方式

目錄

  1. 引言
  2. 使用@PostConstruct@PreDestroy注解
    • @PostConstruct
    • @PreDestroy
  3. 實現InitializingBeanDisposableBean接口
    • afterPropertiesSet()
    • destroy()
  4. 使用init-methoddestroy-method屬性
    • init-method
    • destroy-method
  5. 使用@Bean注解的initMethoddestroyMethod屬性
    • initMethod
    • destroyMethod
  6. 使用ApplicationListener接口
    • ContextRefreshedEvent
    • ContextClosedEvent
  7. 通過@EventListener注解處理生命周期事件
  8. 總結

引言

在Spring框架中,有多種方式可以實現初始化和清理代碼的執行。每種方式都有其適用的場景和特點。本文將逐一介紹這些方式,詳細解釋其用法和注意事項。

使用@PostConstruct@PreDestroy注解

@PostConstruct

@PostConstruct注解用于標記在依賴注入完成后需要執行的方法。這個方法通常用于執行初始化操作。示例如下:

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Component;@Component
public class MyBean {@PostConstructpublic void init() {// 初始化代碼System.out.println("MyBean is initialized");}@PreDestroypublic void cleanup() {// 清理代碼System.out.println("MyBean is cleaned up");}
}

@PreDestroy

@PreDestroy注解用于標記在Bean銷毀前需要執行的方法。這個方法通常用于執行清理操作。

上述示例中的cleanup()方法即是通過@PreDestroy注解實現的,在Bean銷毀前會被調用。

實現InitializingBeanDisposableBean接口

afterPropertiesSet()

實現InitializingBean接口并重寫afterPropertiesSet()方法可以實現初始化邏輯。示例如下:

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.stereotype.Component;@Component
public class MyBean implements InitializingBean, DisposableBean {@Overridepublic void afterPropertiesSet() throws Exception {// 初始化代碼System.out.println("MyBean is initialized");}@Overridepublic void destroy() throws Exception {// 清理代碼System.out.println("MyBean is cleaned up");}
}

destroy()

實現DisposableBean接口并重寫destroy()方法可以實現清理邏輯。上述示例中的destroy()方法即是通過實現DisposableBean接口實現的。

使用init-methoddestroy-method屬性

在Spring配置文件中,可以通過init-methoddestroy-method屬性指定初始化和清理方法。

init-method

以下是一個通過XML配置指定init-method的示例:

<bean id="myBean" class="com.example.MyBean" init-method="init" destroy-method="cleanup"/>

對應的Java類:

public class MyBean {public void init() {// 初始化代碼System.out.println("MyBean is initialized");}public void cleanup() {// 清理代碼System.out.println("MyBean is cleaned up");}
}

destroy-method

init-method類似,destroy-method用于指定Bean銷毀前需要執行的方法。上述示例中的cleanup()方法即是通過XML配置的destroy-method屬性實現的。

使用@Bean注解的initMethoddestroyMethod屬性

initMethod

在Java配置類中,可以通過@Bean注解的initMethoddestroyMethod屬性指定初始化和清理方法。示例如下:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Bean(initMethod = "init", destroyMethod = "cleanup")public MyBean myBean() {return new MyBean();}
}

destroyMethod

initMethod類似,destroyMethod用于指定Bean銷毀前需要執行的方法。上述示例中的cleanup()方法即是通過@Bean注解的destroyMethod屬性實現的。

使用ApplicationListener接口

ContextRefreshedEvent

實現ApplicationListener接口并監聽ContextRefreshedEvent可以實現初始化邏輯。示例如下:

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;@Component
public class ContextRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {// 初始化代碼System.out.println("Context is refreshed");}
}

ContextClosedEvent

實現ApplicationListener接口并監聽ContextClosedEvent可以實現清理邏輯。示例如下:

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component;@Component
public class ContextClosedListener implements ApplicationListener<ContextClosedEvent> {@Overridepublic void onApplicationEvent(ContextClosedEvent event) {// 清理代碼System.out.println("Context is closed");}
}

通過@EventListener注解處理生命周期事件

除了實現ApplicationListener接口外,還可以通過@EventListener注解處理Spring上下文的生命周期事件。

import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class LifecycleEventListener {@EventListenerpublic void handleContextRefreshed(ContextRefreshedEvent event) {// 初始化代碼System.out.println("Context is refreshed");}@EventListenerpublic void handleContextClosed(ContextClosedEvent event) {// 清理代碼System.out.println("Context is closed");}
}

總結

本文詳細介紹了在Spring應用中執行初始化和清理代碼的多種方式,包括使用@PostConstruct@PreDestroy注解、實現InitializingBeanDisposableBean接口、通過init-methoddestroy-method屬性配置、使用@Bean注解的initMethoddestroyMethod屬性、實現ApplicationListener接口以及通過@EventListener注解處理生命周期事件。每種方式都有其適用的場景和特點,開發者可以根據具體需求選擇合適的方式來實現初始化和清理邏輯。

通過掌握這些技術,您可以更加靈活地控制Spring應用的生命周期管理,確保資源的合理使用和應用的穩定運行。如果您有任何問題或建議,歡迎在評論區留言討論。

Happy Coding!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40139.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【高級篇】第8章 Elasticsearch 安全與權限管理

在深入探討Elasticsearch高級應用的征途中,我們無法忽視其核心——安全與權限管理的重要性。此章節將為你全面剖析如何構建一個既強大又安全的數據搜索與分析平臺。本章內容將圍繞X-Pack的強大功能展開,深入用戶與角色管理的實踐,以及如何利用SSL/TLS加密來強化數據傳輸的安…

如何使用C++調用Pytorch模型進行推理測試:使用libtorch庫

如何使用C調用Pytorch模型進行推理測試&#xff1a;使用libtorch庫 目錄 如何使用C調用Pytorch模型進行推理測試&#xff1a;使用libtorch庫一、環境準備1&#xff0c;linux&#xff1a;以ubuntu 22.04系統為例1. 準備CUDA和CUDNN2. 準備C環境3, 下載libtorch文件4, 編寫測試li…

期權學習必看圣書:《3小時快學期權》要在哪里看?

今天帶你了解期權學習必看圣書&#xff1a;《3小時快學期權》要在哪里看&#xff1f;《3小時快學期權》是一本關于股票期權基礎知識的書籍。 它旨在通過簡明、易懂的語言和實用的案例&#xff0c;讓讀者在短時間內掌握股票期權的基本概念、操作方法和投資策略。通過這本書&…

img的onload事件不觸發

var img new Image(); img.src "圖片地址" img.addEventListener(load, function() {// 加載完后的處理 }, false);上面的代碼&#xff0c;可能存在設置addEventListener之前&#xff0c;圖片已經加載完了&#xff0c;onload事件不處罰。 調換一下img.src和img.add…

Linux系統(CentOS)安裝Mysql5.7.x

安裝準備&#xff1a; Linux系統(CentOS)添加防火墻、iptables的安裝和配置 請訪問地址&#xff1a;https://blog.csdn.net/esqabc/article/details/140209894 1&#xff0c;下載mysql安裝文件&#xff08;mysql-5.7.44為例&#xff09; 選擇Linux通用版本64位&#xff08;L…

算力互聯網網絡架構;SRV6;智享WAN

目錄 算力互聯網網絡架構 SRV6 主要特點 應用場景 結論 G-SRV6 多層次網絡切片 智享WAN 一、定義與背景 二、關鍵技術 三、應用場景與優勢 四、發展現狀與未來展望 智能算力網絡成為智能經濟時代代表性數字基礎設施 算力互聯網網絡架構 為構建算力互聯網這個前瞻性…

SQLAlchemy配置連接多個數據庫

1.定義配置項 首先定義兩個數據庫的配置信息 # PostgreSQL database configuration DB_USERNAMEpostgres DB_PASSWORDpassord DB_HOST127.0.0.1 DB_PORT5432 DB_DATABASEtest# mysql database configuration DB_USERNAME_MYSQLroot DB_PASSWORD_MYSQLpassword DB_HOST_MYSQL127…

后端之路——阿里云OSS云存儲

一、何為阿里云OSS 全名叫“阿里云對象存儲OSS”&#xff0c;就是云存儲&#xff0c;前端發文件到服務器&#xff0c;服務器不用再存到本地磁盤&#xff0c;可以直接傳給“阿里云OSS”&#xff0c;存在網上。 二、怎么用 大體邏輯&#xff1a; 細分的話就是&#xff1a; 1、準…

Rust: Fury高性能序列化庫嘗試

在序列化庫中&#xff0c;傳統的有Json,XML&#xff0c;性能好的有thrift&#xff0c;protobuf等。據說Fury官網的介紹&#xff0c;Fury性能要遠遠好于protobuf&#xff0c;且不象protobuf還需要定義IDL&#xff0c;非常輕便&#xff0c;隨取隨用。 今天來嘗試一下。 一、carg…

gitlab每日備份以及restore

gitlab服務有非常簡潔的每日備份命令&#xff0c; 從production的gitlab的每日備份中restore到backup環境也非常方便。 一、Production gitlab每日備份 1. Production gitlab環境上編寫腳本 cat /root/gitlab_bak.shgitlab-rake gitlab:backup:create > /var/opt/gitl…

JavaSE (Java基礎):面向對象(下)

8.7 多態 什么是多態&#xff1f; 即同一方法可以根據發送對象的不同而采用多種不同的方式。 一個對象的實際類型是確定的&#xff0c;但可以指向對象的引用的類型有很多。在句話我是這樣理解的&#xff1a; 在實例中使用方法都是根據他最開始將類實例化最左邊的類型來定的&…

消息中間件ApacheKafka在windows簡單安裝

一.背景 之前公司需要API網關管理軟件ApacheShenYu&#xff0c;我相信把調用的記錄都存到一個數據庫。他支持日志推送到kafka&#xff0c;所以&#xff0c;我準備嘗試一下通過kafka接收調用的日志信息。第一步&#xff0c;當然是安裝kafka了。 二.ApacheKafka的下載 打開下載…

【C++】 解決 C++ 語言報錯:Memory Leak

文章目錄 引言 內存泄漏&#xff08;Memory Leak&#xff09;是 C 編程中常見且嚴重的內存管理問題之一。當程序分配了內存而沒有正確釋放&#xff0c;導致內存無法被重新利用時&#xff0c;就會發生內存泄漏。這種錯誤會導致程序占用越來越多的內存&#xff0c;最終可能導致系…

關于人情世故的小討論

大家好&#xff0c;我是阿趙。 ??最近國內籃球界內出了不少事情&#xff0c;讓人對籃球這項運動產生了很多疑問。 ??去年的CUBA&#xff0c;擁有全國最好生源的清華大學居然輸給了連985 、211都不是的廣東工業大學。作為廣工的畢業生&#xff0c;我知道廣工的籃球一直都很強…

Unity PC和Android端的數據存儲和讀取

使用Resource&#xff1a; 提示&#xff1a;使用resouce打包后會被壓縮進.resources文件中&#xff0c;意味著它是只讀文件&#xff0c;且必須使用resouce.load加載&#xff1a; /// <summary>/// 全平臺使用/// </summary>/// <typeparam name"T"&g…

論文學習——動態多目標優化的一種新的分位數引導的對偶預測策略

論文題目&#xff1a;A novel quantile-guided dual prediction strategies for dynamic multi-objective optimization 動態多目標優化的一種新的分位數引導的對偶預測策略&#xff08;Hao Sun a,b, Anran Cao a,b, Ziyu Hu a,b, Xiaxia Li a,b, Zhiwei Zhao c&#xff09;In…

“免費”的可視化大屏案例分享-智慧園區綜合管理平臺

一.智慧園區是什么&#xff1f; 智慧園區是一種融合了新一代信息與通信技術的先進園區發展理念。它通過迅捷信息采集、高速信息傳輸、高度集中計算、智能事務處理和無所不在的服務提供能力&#xff0c;實現了園區內及時、互動、整合的信息感知、傳遞和處理。這樣的園區旨在提高…

自定義注解-手機號驗證注解

注解 package com.XX.assess.annotation;import com.XX.assess.util.MobileValidator;import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*;/*** 手機號校驗注解* @author super*/ @Retention(RetentionPolicy.RUNTIME) @Ta…

正確使用Pytorch Geometric打開Cora(Planetoid)數據集

文章目錄 關于報錯&#xff08;"Cannot connect to host"&#xff09;解決方法 關于報錯&#xff08;“Cannot connect to host”&#xff09; 我們在使用PyG調用Planetoid數據集的時候&#xff0c;常會碰到如下報錯&#xff1a; 解決方法就是手動下載這個數據集。…

在 AWS Lambda 中使用 Flask 應用

本文將介紹如何在 AWS Lambda 中創建和部署一個使用 Flask 框架的應用。 1. 創建 Lambda 函數 首先,在 AWS Lambda 控制臺創建一個新的函數,命名為 ??flask-app??。 2. 準備 Flask 層 為了在 Lambda 中使用 Flask,我們需要創建一個包含 Flask 庫的層。按照以下步驟操…