欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中@PostConstruct 注解的實(shí)現(xiàn)

 更新時(shí)間:2024年09月24日 09:05:24   作者:訾博ZiBo  
在Spring Boot框架中,?@PostConstruct是一個(gè)非常有用的注解,它用于在依賴注入完成后執(zhí)行初始化方法,本文將介紹?@PostConstruct的基本概念、使用場(chǎng)景以及提供詳細(xì)的代碼示例,感興趣的可以了解一下

在Spring Boot框架中, @PostConstruct是一個(gè)非常有用的注解,它用于在依賴注入完成后執(zhí)行初始化方法。這個(gè)注解是Java EE規(guī)范的一部分,被廣泛應(yīng)用于企業(yè)級(jí)應(yīng)用開(kāi)發(fā)中。本文將介紹 @PostConstruct的基本概念、使用場(chǎng)景以及提供詳細(xì)的代碼示例。

一、基本介紹

@PostConstruct注解用于標(biāo)注在方法上,這個(gè)方法會(huì)在依賴注入完成后自動(dòng)執(zhí)行。它通常用于執(zhí)行一些初始化操作,比如設(shè)置一些初始值、啟動(dòng)定時(shí)任務(wù)、初始化數(shù)據(jù)庫(kù)連接等。

使用@PostConstruct注解的方法必須滿足以下條件:

  • 方法不能有參數(shù);
  • 方法返回類型必須是void;
  • 方法不能拋出受檢異常(checked exceptions);
  • 方法可以是public、protected、package-private或者private;
  • 方法可以是static,但通常不推薦使用static方法,因?yàn)殪o態(tài)方法無(wú)法被容器管理。

這是一個(gè)很好的問(wèn)題。讓我們深入探討一下 @PostConstruct 的執(zhí)行時(shí)機(jī)。

二、@PostConstruct 的執(zhí)行時(shí)機(jī)

@PostConstruct 注解的方法在 Spring Bean 的生命周期中有一個(gè)特定的執(zhí)行時(shí)機(jī)。為了更好地理解這一點(diǎn),我們需要了解 Spring Bean 的生命周期。

Spring Bean 的生命周期

Spring Bean 的生命周期大致可以分為以下幾個(gè)階段:

  • 實(shí)例化(Instantiation)
  • 屬性賦值(Populate Properties)
  • 初始化(Initialization)
  • 銷毀(Destruction)

@PostConstruct 注解的方法在初始化階段執(zhí)行,更具體地說(shuō):

@PostConstruct 的確切執(zhí)行時(shí)機(jī)

  • 在 Bean 的構(gòu)造方法執(zhí)行完畢之后
  • 在屬性賦值完成之后
  • 在 InitializingBean 的 afterPropertiesSet() 方法之前
  • 在自定義的 init() 方法之前

執(zhí)行順序示例

為了更清楚地展示 @PostConstruct 的執(zhí)行時(shí)機(jī),讓我們看一個(gè)包含多個(gè)生命周期回調(diào)的示例:

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class LifecycleDemoBean implements InitializingBean {

    public LifecycleDemoBean() {
        System.out.println("1. Constructor");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("3. PostConstruct");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("4. AfterPropertiesSet");
    }

    public void init() {
        System.out.println("5. Custom init method");
    }

    // Assume this method is called by Spring to set a property
    public void setProperty(String property) {
        System.out.println("2. Property set: " + property);
    }
}

在這個(gè)例子中,輸出順序?qū)?huì)是:

  • Constructor
  • Property set: someValue
  • PostConstruct
  • AfterPropertiesSet
  • Custom init method

重要注意事項(xiàng)

  • @PostConstruct 方法在依賴注入完成后立即執(zhí)行,這意味著它可以使用注入的依賴。

  • 如果一個(gè)類中有多個(gè) @PostConstruct 方法,它們的執(zhí)行順序是不確定的。因此,最好只使用一個(gè) @PostConstruct 方法。

  • @PostConstruct 方法在每次創(chuàng)建 Bean 時(shí)只執(zhí)行一次。如果 Bean 的作用域是 singleton(默認(rèn)),那么在整個(gè)應(yīng)用生命周期中只會(huì)執(zhí)行一次。

  • 如果在 @PostConstruct 方法中拋出異常,會(huì)阻止 Bean 的正常創(chuàng)建,可能導(dǎo)致應(yīng)用啟動(dòng)失敗。

  • @PostConstruct 方法可以是 private、protected 或 public,但不能是 static。

三、使用場(chǎng)景及代碼示例

1. 初始化資源:比如打開(kāi)數(shù)據(jù)庫(kù)連接、初始化緩存等。

import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

@Component
public class DatabaseInitializer {
    private Connection connection;

    @PostConstruct
    public void initializeDatabase() {
        try {
            String url = "jdbc:mysql://localhost:3306/mydb";
            String user = "username";
            String password = "password";
            connection = DriverManager.getConnection(url, user, password);
            System.out.println("Database connection established.");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

2. 設(shè)置默認(rèn)值:在對(duì)象創(chuàng)建后,設(shè)置一些默認(rèn)屬性值。

import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class ConfigurationManager {
    private String defaultLanguage;
    private int maxConnections;

    @PostConstruct
    public void setDefaults() {
        defaultLanguage = "English";
        maxConnections = 100;
        System.out.println("Default values set: Language=" + defaultLanguage + ", Max Connections=" + maxConnections);
    }
}

3. 啟動(dòng)定時(shí)任務(wù):在Spring中,可以使用@PostConstruct來(lái)啟動(dòng)一個(gè)定時(shí)任務(wù)。

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class ScheduledTaskManager {
    
    @PostConstruct
    public void initScheduledTasks() {
        System.out.println("Scheduled tasks initialized.");
        startPeriodicTask();
    }

    @Scheduled(fixedRate = 60000) // Run every minute
    public void startPeriodicTask() {
        System.out.println("Executing periodic task...");
    }
}

4. 執(zhí)行驗(yàn)證:在對(duì)象創(chuàng)建并注入依賴后,執(zhí)行一些驗(yàn)證邏輯。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class UserService {
    
    @Autowired
    private UserRepository userRepository;

    @PostConstruct
    public void validateRepository() {
        if (userRepository == null) {
            throw new IllegalStateException("UserRepository is not initialized!");
        }
        System.out.println("UserRepository successfully validated.");
    }
}

四、注意事項(xiàng)

  • @PostConstruct方法在每次創(chuàng)建bean時(shí)只執(zhí)行一次。
  • 如果類中有多個(gè)@PostConstruct方法,它們的執(zhí)行順序是不確定的。
  • @PostConstruct方法應(yīng)該盡量保持簡(jiǎn)短和高效,避免執(zhí)行耗時(shí)的操作。
  • @PostConstruct方法中拋出的異常會(huì)導(dǎo)致bean的創(chuàng)建失敗。

五、結(jié)論

@PostConstruct注解是Spring框架中一個(gè)強(qiáng)大而靈活的工具,它允許開(kāi)發(fā)者在bean生命周期的特定時(shí)刻執(zhí)行初始化邏輯。通過(guò)合理使用@PostConstruct,可以確保在應(yīng)用啟動(dòng)時(shí)正確初始化資源、設(shè)置默認(rèn)值、啟動(dòng)后臺(tái)任務(wù)等,從而提高應(yīng)用的健壯性和可維護(hù)性。

到此這篇關(guān)于SpringBoot中@PostConstruct 注解的實(shí)現(xiàn) 的文章就介紹到這了,更多相關(guān)SpringBoot @PostConstruct 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中BCryptPasswordEncoder密碼的加密與驗(yàn)證方式

    java中BCryptPasswordEncoder密碼的加密與驗(yàn)證方式

    這篇文章主要介紹了java中BCryptPasswordEncoder密碼的加密與驗(yàn)證方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Maven的使用之繼承與聚合

    Maven的使用之繼承與聚合

    這篇文章主要為大家詳細(xì)介紹了Maven的繼承和聚合,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2023-04-04
  • Mybatis-plus基于redis實(shí)現(xiàn)二級(jí)緩存過(guò)程解析

    Mybatis-plus基于redis實(shí)現(xiàn)二級(jí)緩存過(guò)程解析

    這篇文章主要介紹了Mybatis-plus基于redis實(shí)現(xiàn)二級(jí)緩存過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • JVM自定義類加載器在代碼擴(kuò)展性實(shí)踐分享

    JVM自定義類加載器在代碼擴(kuò)展性實(shí)踐分享

    這篇文章主要介紹了JVM自定義類加載器在代碼擴(kuò)展性實(shí)踐分享,一個(gè)類型從被加載到虛擬機(jī)內(nèi)存中開(kāi)始,到卸載出內(nèi)存為止,它的整個(gè)生命周期將會(huì)經(jīng)歷加載、驗(yàn)證、準(zhǔn)備、解析、初始化 、使用和卸載七個(gè)階段,其中驗(yàn)證、準(zhǔn)備、解析三個(gè)部分統(tǒng)稱為連接
    2022-06-06
  • SpringCloud注冊(cè)中心之consul詳細(xì)講解使用方法

    SpringCloud注冊(cè)中心之consul詳細(xì)講解使用方法

    Consul是一款由HashiCorp公司開(kāi)源的,用于服務(wù)治理的軟件,Spring Cloud Consul對(duì)其進(jìn)行了封裝,這篇文章主要介紹了springcloud組件consul服務(wù)治理,需要的朋友可以參考下
    2022-11-11
  • Java數(shù)字簽名算法DSA實(shí)例詳解

    Java數(shù)字簽名算法DSA實(shí)例詳解

    這篇文章主要介紹了Java數(shù)字簽名算法DSA,結(jié)合實(shí)例形式分析了Java數(shù)字簽名算法DSA具體定義與使用技巧,需要的朋友可以參考下
    2018-05-05
  • Java中IO流的BufferedOutputStream和FileOutputStream對(duì)比

    Java中IO流的BufferedOutputStream和FileOutputStream對(duì)比

    這篇文章主要介紹了Java中IO流的BufferedOutputStream和FileOutputStream對(duì)比,不帶緩沖的操作,每讀一個(gè)字節(jié)就要寫(xiě)入一個(gè)字節(jié),由于涉及磁盤(pán)的IO操作相比內(nèi)存的操作要慢很多,所以在讀寫(xiě)的字節(jié)比較少的情況下,效率比較低,需要的朋友可以參考下
    2023-07-07
  • Java實(shí)現(xiàn)十秒向MySQL插入百萬(wàn)條數(shù)據(jù)

    Java實(shí)現(xiàn)十秒向MySQL插入百萬(wàn)條數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)十秒向MySQL插入百萬(wàn)條數(shù)據(jù),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定借鑒價(jià)值,需要的可以參考一下
    2022-11-11
  • solr在java中的使用實(shí)例代碼

    solr在java中的使用實(shí)例代碼

    本篇文章主要介紹了solr在java中的使用實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • springboot利用@Aspect實(shí)現(xiàn)日志工具類的詳細(xì)代碼

    springboot利用@Aspect實(shí)現(xiàn)日志工具類的詳細(xì)代碼

    這篇文章主要介紹了springboot利用@Aspect實(shí)現(xiàn)日志工具類,通過(guò)實(shí)例代碼介紹了導(dǎo)包及在啟動(dòng)類上進(jìn)行注解自動(dòng)掃描的方法,需要的朋友可以參考下
    2022-03-03

最新評(píng)論