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

基于@PostConstruct注解的使用,解決向靜態(tài)變量注入值

 更新時(shí)間:2021年09月18日 11:34:52   作者:Ru_yin_hai  
這篇文章主要介紹了基于@PostConstruct注解的使用,解決向靜態(tài)變量注入值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

@PostConstruct注解的使用,向靜態(tài)變量注入值

今天在編寫工具類時(shí)遇到了一個(gè)問(wèn)題,一般在定義工具類方時(shí),我們會(huì)將工具類中的方法定義成static類型,使用時(shí)可以通過(guò)類名.方法名獲取該方法,無(wú)需實(shí)例化出對(duì)象才能使用其內(nèi)部方法,但是當(dāng)有些參數(shù)在配置文件中定義時(shí),我們需要拿到這些參數(shù)就需要在工具類方法使用@Value注解進(jìn)行參數(shù)注入,但是@Value并不支持向static變量進(jìn)行注入(spring并不推薦將變量或?qū)ο舐暶鳛閟tatic類型,因?yàn)檫@樣擴(kuò)大了他們的使用范圍,spring依賴注入的目的就是,需要對(duì)象時(shí)進(jìn)行向容器中注入,在整個(gè)聲明周期中使用到他們,同時(shí)也讓testing工作更加容易,一但聲明為static后,就不需要再產(chǎn)生該對(duì)象的實(shí)例,這會(huì)讓testing變得更加困難,同時(shí)你也不能為一個(gè)給定的類,依靠注入方式去產(chǎn)生多個(gè)具有不同的依賴環(huán)境的實(shí)例.

這種static field是隱含共享的,并且是一種global全局狀態(tài),spring同樣不推薦這樣去做.)

因此現(xiàn)在工具類中的參數(shù)如何進(jìn)行使用,現(xiàn)在注入的參數(shù)是非靜態(tài)的,而方法是靜態(tài)的,如何在靜態(tài)方法中使用到非靜態(tài)變量呢?

可以使用@PostConstruct注解進(jìn)行使用

說(shuō)說(shuō)思路

我們可以通過(guò)非靜態(tài)變量進(jìn)行注入值,再通過(guò)@PostConstruct定義的init方法進(jìn)行將非靜態(tài)的變量值賦給靜態(tài)變量值(這里需要了解下類加載的先后順序)

代碼如下:

@Component
public class BaiduTranslateUtils { 
    private static Logger logger = LoggerFactory.getLogger(BaiduTranslateUtils.class);
    private static String BAIDU_FROM = "en";
    private static String BAIDU_TO = "zh";
    private static String BAIDU_DST = "dst";
    private static String APP_ID;
    private static String SECURITY_KEY;
 
    @Value("${baidu.translate.app_id}")
    private String app_id;
 
    @Value("${baidu.translate.security_key}")
    private   String security_key;
 
    @PostConstruct
    public void init(){
        //初始化賦值
        APP_ID = app_id;
        SECURITY_KEY = security_key;
    }     
    public static String getEntozhOfString(String dis){
        //靜態(tài)方法使用靜態(tài)變量
        System.out.println(APP_ID+SECURITY_KEY);
    } 
}

@PostConstruct和靜態(tài)變量注入和spring初始化

@PostConstruct這個(gè)注解是由Java提供的,而不是spring提供的,它用來(lái)修飾一個(gè)非靜態(tài)的void方法。它會(huì)在服務(wù)器加載Servlet的時(shí)候運(yùn)行,并且只運(yùn)行一次。bean創(chuàng)建完成空對(duì)象,就開(kāi)始進(jìn)行@Autowire、@PostConstruct賦值。

@Component
public class SystemConstant {
    public static String surroundings;
    @Value("${spring.profiles.active}")
    public String environment;
    @PostConstruct
    public void initialize() {
        System.out.println("初始化環(huán)境...");
        surroundings = this.environment;
    }
}

執(zhí)行順序

  • 第一種:當(dāng)直接調(diào)用(沒(méi)有new對(duì)象)靜態(tài)方法時(shí)候:代碼塊(靜態(tài)變量按照順序)就執(zhí)行—–方法執(zhí)行。
  • 第二種創(chuàng)建對(duì)象:執(zhí)行父類靜態(tài)代碼—-執(zhí)行子類的靜態(tài)代碼—-執(zhí)行父類構(gòu)造方法—–執(zhí)行子類的構(gòu)造方法(注:@PostConstruct修飾的方法是在構(gòu)造方法之后執(zhí)行的)

注:靜態(tài)變量和靜態(tài)代碼塊都是按照代碼書寫順序執(zhí)行的,對(duì)于靜態(tài)代碼塊只要是操作(調(diào)用靜態(tài)方法或者新建一個(gè)類等)這個(gè)類就會(huì)執(zhí)行(包括靜態(tài)變量)

靜態(tài)變量也可以用value注解進(jìn)行注入,只要將注解放在變量的set方法上即可,且方法不可為靜態(tài)方法

@Component
public class SystemConstant {
    public static String surroundings;
    @Value("${spring.profiles.active}")
    public String environment;
    
 @Value("${spring.profiles.active}")
 public void setSurroundings(String surroundings ){
  SystemConstant .surroundings = surroundings;
 }
}

關(guān)于spring初始化操作

實(shí)現(xiàn)ApplicationRunner接口,然后Override這個(gè)ApplicationRunner接口的run方法即可

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中List刪除元素的幾種方法總結(jié)推薦

    Java中List刪除元素的幾種方法總結(jié)推薦

    這篇文章主要給大家介紹了關(guān)于Java中List刪除元素的幾種方法總結(jié),相信大家在日常的開(kāi)發(fā)過(guò)程中,經(jīng)常需要對(duì)List或Map里面的符合某種業(yè)務(wù)的數(shù)據(jù)進(jìn)行刪除,需要的朋友可以參考下
    2023-10-10
  • Java中動(dòng)態(tài)規(guī)則的實(shí)現(xiàn)方式示例詳解

    Java中動(dòng)態(tài)規(guī)則的實(shí)現(xiàn)方式示例詳解

    這篇文章主要介紹了Java中動(dòng)態(tài)規(guī)則的實(shí)現(xiàn)方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • spring boot ${}占位符不起作用的解決方案

    spring boot ${}占位符不起作用的解決方案

    這篇文章主要介紹了spring boot ${}占位符不起作用的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springboot集成kafka消費(fèi)手動(dòng)啟動(dòng)停止操作

    springboot集成kafka消費(fèi)手動(dòng)啟動(dòng)停止操作

    這篇文章主要介紹了springboot集成kafka消費(fèi)手動(dòng)啟動(dòng)停止操作,本文給大家介紹項(xiàng)目場(chǎng)景及解決分析,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • java中-jar 與nohup的對(duì)比

    java中-jar 與nohup的對(duì)比

    這篇文章主要介紹了java中 -jar 與nohup的對(duì)比的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 淺談spring中的default-lazy-init參數(shù)和lazy-init

    淺談spring中的default-lazy-init參數(shù)和lazy-init

    下面小編就為大家?guī)?lái)一篇淺談spring中的default-lazy-init參數(shù)和lazy-init。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • java二路歸并排序示例分享

    java二路歸并排序示例分享

    這篇文章主要介紹了java二路歸并排序示例,需要的朋友可以參考下
    2014-02-02
  • SpringMVC處理數(shù)據(jù)輸出的實(shí)例代碼

    SpringMVC處理數(shù)據(jù)輸出的實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于SpringMVC處理數(shù)據(jù)輸出的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Echarts+SpringMvc顯示后臺(tái)實(shí)時(shí)數(shù)據(jù)

    Echarts+SpringMvc顯示后臺(tái)實(shí)時(shí)數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了Echarts+SpringMvc顯示后臺(tái)實(shí)時(shí)數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Java實(shí)現(xiàn)生成自定義時(shí)長(zhǎng)的靜音音頻

    Java實(shí)現(xiàn)生成自定義時(shí)長(zhǎng)的靜音音頻

    這篇文章主要介紹了如何通過(guò)Java實(shí)現(xiàn)一個(gè)音頻工具類,可以實(shí)現(xiàn)生成一段自定義時(shí)長(zhǎng)(精確到毫秒)的wav音頻。感興趣的小伙伴可以了解一下
    2022-01-01

最新評(píng)論