首頁 > 軟體

springboot 靜態方法中使用@Autowired注入方式

2022-02-14 13:01:31

靜態方法使用@Autowired注入

@Component
public class StructUtil {
    private static StructService structService;
    private static List<StructInfo> structInfos;
	
	// 通過重寫set注入
    @Autowired
    public void setStructService(StructService structService){
        StructUtil.structService = structService;
    }
    public static List<StructInfo> getStruct(){
        if(null==structInfos){
            structInfos = structService.getStruct();
        }
        return structInfos;
    }
}

靜態方法使用@Autowired注入的類

在寫公眾號開發的時候,有一個處理get請求,我想使用Spring提供的RestTemplate處理傳送;

原來是這樣的

@Component
public  class WeChatContant {
@Autowired
    private RestTemplate restTemplate;
 /**
     * 編寫Get請求的方法。但沒有引數傳遞的時候,可以使用Get請求
     *
     * @param url 需要請求的URL
     * @return 將請求URL後返回的資料,轉為JSON格式,並return
     */
    public  JSONObject doGerStr(String url) throws IOException {
        ResponseEntity responseEntity = restTemplate.getForEntity
                (
                        url,
                        String.class
                );
        Object body = responseEntity.getBody();
        assert body != null;
        JSONObject jsonObject = JSONObject.fromObject(body);
        System.out.println(11);
        return jsonObject;
    }
}

但是到這裡的話restTemplate這個值為空,最後導致空指標異常。發生的原因是

static模組會被引入,當class載入後。你的component元件的依賴還沒有初始化。

(你的依賴都是null)

解決方法

可以使用@PostConstruct這個註解解決

1,@PostConstruct 註解的方法在載入類別建構函式之後執行,也就是在載入了建構函式之後,為此,可以使用@PostConstruct註解一個方法來完成初始化,@PostConstruct註解的方法將會在依賴注入完成後被自動呼叫。

2,執行優先順序高於非靜態的初始化塊,它會在類初始化(類載入的初始化階段)的時候執行一次,執行完成便銷燬,它僅能初始化類變數,即static修飾的資料成員。

自己理解的意思就是在component元件都載入完之後再載入

修改過後的程式碼如下

@Component
public  class WeChatContant {
    @Autowired
    private RestTemplate restTemplate;
    private static RestTemplate restTemplateemp;
    @PostConstruct
    public void init(){
        restTemplateemp  = restTemplate;
    }
    /**
     * 編寫Get請求的方法。但沒有引數傳遞的時候,可以使用Get請求
     *
     * @param url 需要請求的URL
     * @return 將請求URL後返回的資料,轉為JSON格式,並return
     */
    public static JSONObject doGerStr(String url) throws IOException {
        ResponseEntity responseEntity = restTemplateemp.getForEntity
                (
                        url,
                        String.class
                );
        Object body = responseEntity.getBody();
        assert body != null;
        JSONObject jsonObject = JSONObject.fromObject(body);
        System.out.println(11);
        return jsonObject;
    }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com