Spring boot 無(wú)法注入service問(wèn)題
Spring boot 無(wú)法注入service
SpringBoot項(xiàng)目的Bean裝配默認(rèn)規(guī)則是根據(jù)Application類(lèi)所在的包位置從上往下掃描!
“Application類(lèi)”是指SpringBoot項(xiàng)目入口類(lèi)。
這個(gè)類(lèi)的位置很關(guān)鍵:
如果Application類(lèi)所在的包為:com.boot.app,則只會(huì)掃描com.boot.app包及其所有子包,如果service或dao所在包不在com.boot.app及其子包下,則不會(huì)被掃描!
即,把Application類(lèi)放到dao、service所在包的上級(jí),com.boot.Application
知道這一點(diǎn)非常關(guān)鍵,大多數(shù)情況下bean無(wú)法注入進(jìn)來(lái)都是這個(gè)原因引起的。
附上正確目錄結(jié)構(gòu)

@Autowired注入無(wú)法實(shí)例化service
問(wèn)題場(chǎng)景
springboot整合netty時(shí),netty的處理類(lèi)無(wú)法實(shí)例化service
問(wèn)題解讀
經(jīng)過(guò)查閱資料,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.聲明本類(lèi)
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)過(guò)以上4步驟的處理
for (Map dto : variants){
String key = dto.get("key").toString();
nettyServerHandler.redisUtils.hmset(dto.get("key").toString(),
dto, 100000);
}
//nettyServerHandler.redisUtils.hmset() 通過(guò)這種方式調(diào)用redisUtils就可以了
@PostConstruct 描述
@PostConstruct
從Java EE5規(guī)范開(kāi)始,Servlet增加了兩個(gè)影響Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct。這兩個(gè)注解被用來(lái)修飾一個(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è)類(lèi)a中有個(gè)成員變量b被@Autowired注解,那么@Autowired注入是發(fā)生在a的構(gòu)造方法執(zhí)行完之后的。
如果想在生成對(duì)象時(shí)候完成某些初始化操作,而偏偏這些初始化操作又依賴于依賴注入,那么就無(wú)法在構(gòu)造函數(shù)中實(shí)現(xiàn)。為此,可以使用@PostConstruct注解一個(gè)方法來(lái)完成初始化,@PostConstruct注解的方法將會(huì)在依賴注入完成后被自動(dòng)調(diào)用。
Constructor >> @Autowired >> @PostConstruct
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java進(jìn)階之Object類(lèi)及常用方法詳解
Object?類(lèi)是?Java?默認(rèn)提供的一個(gè)類(lèi),是所有?Java?類(lèi)的祖先類(lèi),每個(gè)類(lèi)都使用?Object?作為父類(lèi)。本文就來(lái)和大家聊聊Object類(lèi)的常用方法,希望對(duì)大家有所幫助2023-01-01
Java設(shè)置Map過(guò)期時(shí)間的的幾種方法舉例詳解
本文詳細(xì)介紹了Java中使用輕量級(jí)緩存組件ExpiringMap以及Guava的LoadingCache緩存機(jī)制,ExpiringMap提供了Map自動(dòng)過(guò)期、監(jiān)聽(tīng)事件等功能,而LoadingCache提供了緩存回收、數(shù)據(jù)加載等高級(jí)功能,兩者為Java項(xiàng)目提供了有效的數(shù)據(jù)管理和緩存解決方案,需要的朋友可以參考下2024-10-10
Java中JSON字符串進(jìn)行各種轉(zhuǎn)換的方法小結(jié)
Gson和Hutool的JSONUtil都是常用的用于處理JSON數(shù)據(jù)的工具庫(kù),它們提供了簡(jiǎn)單易用的API來(lái)進(jìn)行JSON字符串的解析、轉(zhuǎn)換和操作,下面就跟隨小編一起學(xué)習(xí)一下如果使用他們實(shí)現(xiàn)JSON字符串的各種轉(zhuǎn)換吧2024-01-01
JAVA后臺(tái)轉(zhuǎn)換成樹(shù)結(jié)構(gòu)數(shù)據(jù)返回給前端的實(shí)現(xiàn)方法
這篇文章主要介紹了JAVA后臺(tái)轉(zhuǎn)換成樹(shù)結(jié)構(gòu)數(shù)據(jù)返回給前端的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Java?Stream流中的filter()使用方法舉例詳解
filter()是Java?Stream?API中的中間操作,用于根據(jù)給定的Predicate條件篩選流中的元素,它通過(guò)接收一個(gè)返回boolean值的函數(shù)(斷言)作為參數(shù),篩選出滿足條件的元素并收集到新的流中,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11
mybatis打印SQL,并顯示參數(shù)的實(shí)例
這篇文章主要介紹了mybatis打印SQL,并顯示參數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
SpringBoot實(shí)戰(zhàn)之SSL配置詳解
今天小編就為大家分享一篇關(guān)于SpringBoot實(shí)戰(zhàn)之SSL配置詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02

