javascript
【SpringBoot】如何在静态工具类中注入mapper?
問題描述
開發(fā)過程中偶爾遇到一個問題,一個工具類中的靜態(tài)方法調(diào)用mybatis的mapper接口時,會出現(xiàn)@Autowired無法注入的問題,即使添加了這個注解,spring容器加載完成聲明的參數(shù)也是空值。
原因
在SpringFramework里,我們是不能@Autowired一個靜態(tài)變量,使之成為一個Spring bean的。
為什么?其實很簡單,因為當(dāng)類加載器加載靜態(tài)變量時,Spring上下文尚未加載。所以類加載器不會在bean中正確注入靜態(tài)類,并且會失敗。
解決方案
查資料發(fā)現(xiàn),用static修飾的方法如果要調(diào)用mapper層時,可以用如下方式實現(xiàn):
首先,在實體類上加上注解@Component,方便spring容器進行加載,然后定義如下:
/*** 在靜態(tài)工具類中注入mapper的方式示例*/ @Component public class CodeMapUtils {private static Logger LOGGER = LoggerFactory.getLogger(DoAllController.class);@Autowiredprivate CodeMapMapper codeMapMapper;private static CodeMapUtils codeMapUtils;@PostConstructpublic void init() {codeMapUtils = this;codeMapUtils.codeMapMapper = this.codeMapMapper;}public static String queryFromCodeMap(String key, String colName) {String value = codeMapUtils.codeMapMapper.getValueByKeyAndColName(key, colName);// do something...} }另外,spring中Constructor、@Autowired、@PostConstruct的順序:
其實從依賴注入的字面意思就可以知道,要將對象p注入到對象a,那么首先就必須得生成對象a和對象p,才能執(zhí)行注入。所以,如果一個類A中有個成員變量p被@Autowried注解,那么@Autowired注入是發(fā)生在A的構(gòu)造方法執(zhí)行完之后的。
如果想在生成對象時完成某些初始化操作,而偏偏這些初始化操作又依賴于依賴注入,那么久無法在構(gòu)造函數(shù)中實現(xiàn)。為此,可以使用@PostConstruct注解一個方法來完成初始化,@PostConstruct注解的方法將會在依賴注入完成后被自動調(diào)用。
加載順序:Constructor >> @Autowired >> @PostConstruct
總結(jié)
以上是生活随笔為你收集整理的【SpringBoot】如何在静态工具类中注入mapper?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java】Java实现 JSON 的组
- 下一篇: 【Python】多线程的使用,通过传参接