Spring boot 無法注入service問題
Spring boot 無法注入service
SpringBoot項(xiàng)目的Bean裝配默認(rèn)規(guī)則是根據(jù)Application類所在的包位置從上往下掃描!
“Application類”是指SpringBoot項(xiàng)目入口類。
這個(gè)類的位置很關(guān)鍵:
如果Application類所在的包為:com.boot.app,則只會(huì)掃描com.boot.app包及其所有子包,如果service或dao所在包不在com.boot.app及其子包下,則不會(huì)被掃描!
即,把Application類放到dao、service所在包的上級(jí),com.boot.Application
知道這一點(diǎn)非常關(guān)鍵,大多數(shù)情況下bean無法注入進(jìn)來都是這個(gè)原因引起的。
附上正確目錄結(jié)構(gòu)
@Autowired注入無法實(shí)例化service
問題場景
springboot整合netty時(shí),netty的處理類無法實(shí)例化service
問題解讀
經(jīng)過查閱資料,netty的bean對(duì)象默認(rèn)不交由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.聲明構(gòu)造方案 public NettyServerHandler(){} //4.添加注解,在項(xiàng)目初始化時(shí)執(zhí)行這個(gè)方法 @PostConstruct public void init() { nettyServerHandler = this; nettyServerHandler.redisUtils = this.redisUtils; } ===================================== 經(jīng)過以上4步驟的處理 for (Map dto : variants){ String key = dto.get("key").toString(); nettyServerHandler.redisUtils.hmset(dto.get("key").toString(), dto, 100000); } //nettyServerHandler.redisUtils.hmset() 通過這種方式調(diào)用redisUtils就可以了
@PostConstruct 描述
@PostConstruct
從Java EE5規(guī)范開始,Servlet增加了兩個(gè)影響Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct。這兩個(gè)注解被用來修飾一個(gè)非靜態(tài)的void()方法.而且這個(gè)方法不能有拋出異常聲明。 @PostContruct是spring框架的注解,在方法上加該注解會(huì)在項(xiàng)目啟動(dòng)的時(shí)候執(zhí)行該方法,也可以理解為在spring容器初始化的時(shí)候執(zhí)行該方法。
@PostConstruct在項(xiàng)目中的用處
@PostConstruct注解的方法在項(xiàng)目啟動(dòng)的時(shí)候執(zhí)行這個(gè)方法,也可以理解為在spring容器啟動(dòng)的時(shí)候執(zhí)行,可加載項(xiàng)目中常規(guī)數(shù)據(jù)。
spring中Constructor、@Autowired、@PostConstruct的順序
要將對(duì)象b注入到對(duì)象a,那么首先就必須得生成對(duì)象b與對(duì)象a,才能執(zhí)行注入。所以,如果一個(gè)類a中有個(gè)成員變量b被@Autowired注解,那么@Autowired注入是發(fā)生在a的構(gòu)造方法執(zhí)行完之后的。
如果想在生成對(duì)象時(shí)候完成某些初始化操作,而偏偏這些初始化操作又依賴于依賴注入,那么就無法在構(gòu)造函數(shù)中實(shí)現(xiàn)。為此,可以使用@PostConstruct注解一個(gè)方法來完成初始化,@PostConstruct注解的方法將會(huì)在依賴注入完成后被自動(dòng)調(diào)用。
Constructor >> @Autowired >> @PostConstruct
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)將CSV轉(zhuǎn)為Excel的示例代碼
CSV(Comma?Separated?Values)文件是一種純文本文件,包含用逗號(hào)分隔的數(shù)據(jù),常用于將數(shù)據(jù)從一個(gè)應(yīng)用程序?qū)牖驅(qū)С龅搅硪粋€(gè)應(yīng)用程序。本文將利用Java實(shí)現(xiàn)CSV轉(zhuǎn)為Excel,感興趣的可以了解一下2022-03-03Java并發(fā)編程之詳解CyclicBarrier線程同步
在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口,ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue,BlockingDeque接口,ConcurrentHashMap,CountDownLatch,本文為系列文章第十篇,需要的朋友可以參考下2021-06-06springboot+EHcache 實(shí)現(xiàn)文章瀏覽量的緩存和超時(shí)更新
這篇文章主要介紹了springboot+EHcache 實(shí)現(xiàn)文章瀏覽量的緩存和超時(shí)更新,問題描述和解決思路給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-04-04Spring?Boot?快速使用?HikariCP?連接池配置詳解
Spring Boot 2.x 將其作為默認(rèn)的連接池組件,項(xiàng)目中添加 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 模塊后,HikariCP 依賴會(huì)被自動(dòng)引入,這篇文章主要介紹了Spring?Boot使用HikariCP連接池配置詳解,需要的朋友可以參考下2023-06-06