問題:
????????如果我們使用正常的 @Component 注解將一個類交由spring管理,然后在使用的時候用@Resource注入對象,在沒有碰到靜態(tài)方法的時候,是不會出現(xiàn)問題,但是如果出現(xiàn)了靜態(tài)方法,這樣的使用方法就會出現(xiàn)空指針的異常,也就是你@Resource注入的對象是空
原因:
????????一個方法或者變量被?static?修飾,則說明改方法或者變量就成為了類方法或者變量,隨著類的加載而加載,會被當(dāng)前類下的所有對象所共有。而@Resource的作用,就是去springbean工廠中去匹配一個對象,并且完成對象的注入,這屬于對象級別的,在此時,類的所有靜態(tài)屬性已經(jīng)被加載完成
????????問題產(chǎn)生的原因就是類加載的先后順序導(dǎo)致的,靜態(tài)屬性會在程序第一次啟動的時候,就完成加載,并且之后不會再有變動,但是使用@Resource注解,則是每次都去spring容器去獲取bean,在靜態(tài)變量初始化的后面,所有就會導(dǎo)致@Resource出現(xiàn)空的情況
解決方案:
? ? ? ? 這里我們要學(xué)習(xí)一個注解 @PostConstruct
????????在Spring Boot項目中,
@PostConstruct
注解用于標(biāo)記一個方法,該方法在類實例化后被調(diào)用,在依賴注入完成之后執(zhí)行。它的作用是在對象創(chuàng)建后執(zhí)行一些初始化操作。????????具體來說,
@PostConstruct
注解通常與依賴注入結(jié)合使用,用于在注入依賴之后執(zhí)行一些必要的初始化任務(wù)。當(dāng)Spring容器實例化一個帶有@PostConstruct
注解的Bean時,它會在所有依賴注入完成之后調(diào)用被注解的方法。
因此,如果我們想要在靜態(tài)方法中使用一個?spring管理的bean,如下:文章來源:http://www.zghlxwxcb.cn/news/detail-688668.html
@Component
public class FileUpload {
@Resource
private CommonConfig commonConfig;
private static FileUpload fileUpload;
@PostConstruct
public void init(){
fileUploadUtil = this;
fileUploadUtil.commonConfig= commonConfig;
}
public static void testSpring(){
fileUploadUtil.commonConfig.xxxx ; // 調(diào)用commonConfig
}
}
????這段代碼的作用是將
CommonConfig
對象注入到FileUploadUtil
類中,并在初始化過程中將其賦值給靜態(tài)變量fileUploadUtil
,以便在其他地方可以通過靜態(tài)變量訪問FileUploadUtil
對象和commonConfig
屬性。文章來源地址http://www.zghlxwxcb.cn/news/detail-688668.html
到了這里,關(guān)于spring管理的bean在靜態(tài)方法使用技巧——@PostConstruct的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!