Spring boot 無法註入service問題
Spring boot 無法註入service
SpringBoot項目的Bean裝配默認規則是根據Application類所在的包位置從上往下掃描!
“Application類”是指SpringBoot項目入口類。
這個類的位置很關鍵:
如果Application類所在的包為:com.boot.app,則隻會掃描com.boot.app包及其所有子包,如果service或dao所在包不在com.boot.app及其子包下,則不會被掃描!
即,把Application類放到dao、service所在包的上級,com.boot.Application
知道這一點非常關鍵,大多數情況下bean無法註入進來都是這個原因引起的。
附上正確目錄結構
@Autowired註入無法實例化service
問題場景
springboot整合netty時,netty的處理類無法實例化service
問題解讀
經過查閱資料,netty的bean對象默認不交由spring管理
解決方案
@Component//1.添加註解 public class NettyServerHandler extends ChannelInboundHandlerAdapter { private static Log log = LogFactory.getLog(NettyServerHandler.class); @Autowired private RedisUtils redisUtils; //2.聲明本類 private static NettyServerHandler nettyServerHandler; //3.聲明構造方案 public NettyServerHandler(){} //4.添加註解,在項目初始化時執行這個方法 @PostConstruct public void init() { nettyServerHandler = this; nettyServerHandler.redisUtils = this.redisUtils; } ===================================== 經過以上4步驟的處理 for (Map dto : variants){ String key = dto.get("key").toString(); nettyServerHandler.redisUtils.hmset(dto.get("key").toString(), dto, 100000); } //nettyServerHandler.redisUtils.hmset() 通過這種方式調用redisUtils就可以瞭
@PostConstruct 描述
@PostConstruct
從Java EE5規范開始,Servlet增加瞭兩個影響Servlet生命周期的註解(Annotation):@PostConstruct和@PreConstruct。這兩個註解被用來修飾一個非靜態的void()方法.而且這個方法不能有拋出異常聲明。 @PostContruct是spring框架的註解,在方法上加該註解會在項目啟動的時候執行該方法,也可以理解為在spring容器初始化的時候執行該方法。
@PostConstruct在項目中的用處
@PostConstruct註解的方法在項目啟動的時候執行這個方法,也可以理解為在spring容器啟動的時候執行,可加載項目中常規數據。
spring中Constructor、@Autowired、@PostConstruct的順序
要將對象b註入到對象a,那麼首先就必須得生成對象b與對象a,才能執行註入。所以,如果一個類a中有個成員變量b被@Autowired註解,那麼@Autowired註入是發生在a的構造方法執行完之後的。
如果想在生成對象時候完成某些初始化操作,而偏偏這些初始化操作又依賴於依賴註入,那麼就無法在構造函數中實現。為此,可以使用@PostConstruct註解一個方法來完成初始化,@PostConstruct註解的方法將會在依賴註入完成後被自動調用。
Constructor >> @Autowired >> @PostConstruct
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Spring Boot中單例類實現對象的註入方式
- springboot 如何解決static調用service為null
- 解決springboot遇到autowire註入為null的問題
- SpringBoot在自定義類中調用service層等Spring其他層操作
- 淺談@PostConstruct不被調用的原因