@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);
    }

}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章