中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在@PostConstruct注解的使用中如何解決向靜態變量注入值

發布時間:2021-09-24 15:57:14 來源:億速云 閱讀:236 作者:柒染 欄目:開發技術

這期內容當中小編將會給大家帶來有關在@PostConstruct注解的使用中如何解決向靜態變量注入值,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

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

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

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

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

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

說說思路

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

代碼如下:

@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賦值。

@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方法上即可,且方法不可為靜態方法

@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方法即可

上述就是小編為大家分享的在@PostConstruct注解的使用中如何解決向靜態變量注入值了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣武区| 阳东县| 金阳县| 东阳市| 达州市| 红桥区| 五常市| 峨山| 岳普湖县| 石棉县| 杭锦后旗| 资讯| 襄樊市| 定兴县| 方城县| 额尔古纳市| 西平县| 宝鸡市| 桦南县| 白玉县| 肃南| 邵东县| 沙洋县| 东丽区| 通河县| 施甸县| 阳曲县| 长宁区| 定安县| 桃园市| 宽甸| 永昌县| 沅陵县| 元阳县| 民勤县| 聊城市| 鄂州市| 阜康市| 双流县| 凤城市| 宾川县|