一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 基于@PostConstruct注解的使用,解決向靜態變量注入值

基于@PostConstruct注解的使用,解決向靜態變量注入值

2022-01-10 13:35Ru_yin_hai Java教程

這篇文章主要介紹了基于@PostConstruct注解的使用,解決向靜態變量注入值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

@PostConstruct注解的使用,向靜態變量注入值

今天在編寫工具類時遇到了一個問題,一般在定義工具類方時,我們會將工具類中的方法定義成static類型,使用時可以通過類名.方法名獲取該方法,無需實例化出對象才能使用其內部方法,但是當有些參數在配置文件中定義時,我們需要拿到這些參數就需要在工具類方法使用@Value注解進行參數注入,但是@Value并不支持向static變量進行注入(spring并不推薦將變量或對象聲明為static類型,因為這樣擴大了他們的使用范圍,spring依賴注入的目的就是,需要對象時進行向容器中注入,在整個聲明周期中使用到他們,同時也讓testing工作更加容易,一但聲明為static后,就不需要再產生該對象的實例,這會讓testing變得更加困難,同時你也不能為一個給定的類,依靠注入方式去產生多個具有不同的依賴環境的實例.

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

因此現在工具類中的參數如何進行使用,現在注入的參數是非靜態的,而方法是靜態的,如何在靜態方法中使用到非靜態變量呢?

可以使用@PostConstruct注解進行使用

說說思路

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

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@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){
        //靜態方法使用靜態變量
        System.out.println(APP_ID+SECURITY_KEY);
    }
}

@PostConstruct和靜態變量注入和spring初始化

@PostConstruct這個注解是由Java提供的,而不是spring提供的,它用來修飾一個非靜態的void方法。它會在服務器加載Servlet的時候運行,并且只運行一次。bean創建完成空對象,就開始進行@Autowire、@PostConstruct賦值。

?
1
2
3
4
5
6
7
8
9
10
11
@Component
public class SystemConstant {
    public static String surroundings;
    @Value("${spring.profiles.active}")
    public String environment;
    @PostConstruct
    public void initialize() {
        System.out.println("初始化環境...");
        surroundings = this.environment;
    }
}

執行順序

  • 第一種:當直接調用(沒有new對象)靜態方法時候:代碼塊(靜態變量按照順序)就執行—–方法執行。
  • 第二種創建對象:執行父類靜態代碼—-執行子類的靜態代碼—-執行父類構造方法—–執行子類的構造方法(注:@PostConstruct修飾的方法是在構造方法之后執行的)

注:靜態變量和靜態代碼塊都是按照代碼書寫順序執行的,對于靜態代碼塊只要是操作(調用靜態方法或者新建一個類等)這個類就會執行(包括靜態變量)

靜態變量也可以用value注解進行注入,只要將注解放在變量的set方法上即可,且方法不可為靜態方法

?
1
2
3
4
5
6
7
8
9
10
11
@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;
 }
}

關于spring初始化操作

實現ApplicationRunner接口,然后Override這個ApplicationRunner接口的run方法即可

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/Ru_yin_hai/article/details/104903046

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
主站蜘蛛池模板: 久久视频在线视频观看精品15 | 欧美区视频 | aa视频免费 | 无耻之徒第十一季在线观看 | 欧美日本一本线在线观看 | 久久99re热在线播放7 | 男男gaygays黑人 | 国产成人精品曰本亚洲78 | 国产视频久久久 | 婷婷久久综合九色综合九七 | 小莹的性荡生活45章 | 麻豆最新地址 | 白鹿扒开内裤露出尿孔 | 无码一区二区三区视频 | zoz.zzz色 | 国产不卡视频一区二区在线观看 | 精品免费国产 | 国产一区二区三区日韩 | 亚洲天堂视频在线播放 | 色婷丁香| 韩国女主播在线大尺无遮挡 | 亚洲免费视频一区 | 色综合久久综精品 | 国产无限 | 日韩亚洲人成网站在线播放 | 亚洲小视频网站 | 三体动漫在线观看免费完整版2022 | 欧美国产日韩综合 | 热剧库| 麻豆最新地址 | 日韩 欧美 国产 亚洲 中文 | 亚洲精品动漫在线观看 | 国内精品91东航翘臀女神在线 | 窝窝色资源站 | xxxxx性中国hd| 王小军怎么了最新消息 | 国产成人精品午夜在线播放 | 色综合天天综合 | 欧美日韩久久中文字幕 | 国产一区二区三区欧美精品 | 国产欧美亚洲精品第一页青草 |