在springboot中實(shí)現(xiàn)個(gè)別bean懶加載的操作
懶加載---就是我們?cè)趕pring容器啟動(dòng)的是先不把所有的bean都加載到spring的容器中去,而是在當(dāng)需要用的時(shí)候,才把這個(gè)對(duì)象實(shí)例化到容器中。
@Lazy
在需要懶加載的bean上加上@Lazy就可以了
補(bǔ)充知識(shí):springboot組件懶加載的坑及加載規(guī)則
什么是懶加載?
懶加載的意思是不在項(xiàng)目啟動(dòng)的時(shí)候?qū)嵗鰜?lái)這個(gè)組件
@RestController
public class ApiController {
@Autowired
Skill kobSkillImpl;
@RequestMapping("/getRust")
public String test(){
kobSkillImpl.print();
return "Welcome Rust's experience";
}
}
首先這是個(gè)api的代碼
@RestController
public class ApiController {
@Autowired
Skill kobSkillImpl;
@RequestMapping("/getRust")
public String test(){
kobSkillImpl.print();
return "Welcome Rust's experience";
}
}
下面是服務(wù)的代碼,我們構(gòu)造函數(shù)輸出一段內(nèi)容以便我們知道它是什么時(shí)候加載的,我們使用了@lazy注解,標(biāo)記且啟動(dòng)懶加載
@Service
@Lazy
public class KoaSkillImpl implements Skill {
KoaSkillImpl(){
System.out.println("Load KoaSkill Impl");
}
@Override
public void print() {
System.out.println("I can KOA.js");
}
}

在這里就能看到,在項(xiàng)目啟動(dòng)的時(shí)候,這個(gè)z組件就已經(jīng)開(kāi)始初始化了,這個(gè)說(shuō)明什么?這個(gè)說(shuō)明@lazy這個(gè)注解在現(xiàn)在是無(wú)效的。那么解決的方案是什么?
解決方案是在api層也要加個(gè)@lazy,也就是說(shuō)被調(diào)用方是懶加載,但是調(diào)用方不是懶加載,最終還不會(huì)執(zhí)行懶加載。
我們?cè)赼pi層也加個(gè)@lazy,執(zhí)行項(xiàng)目發(fā)現(xiàn)沒(méi)有初始化輸出的內(nèi)容了。
那么,在懶加載的作用下,什么時(shí)候會(huì)初始化?
我們請(qǐng)求一下api的接口,發(fā)現(xiàn)控制臺(tái)已經(jīng)產(chǎn)生輸出,并且對(duì)這個(gè)類進(jìn)行了實(shí)例化,也就是說(shuō)懶加載只在使用的時(shí)候進(jìn)行加載,項(xiàng)目啟動(dòng)的時(shí)候不會(huì)對(duì)類實(shí)例化。

2.關(guān)于對(duì)service多實(shí)現(xiàn)類進(jìn)行加載
@Service
public class JavaSkillImpl implements Skill {
@Override
public void print() {
System.out.println("I Can Java");
}
}
@Service
@Lazy
public class KoaSkillImpl implements Skill {
KoaSkillImpl(){
System.out.println("Load KoaSkill Impl");
}
@Override
public void print() {
System.out.println("I can KOA.js");
}
}
@Service
public class PythonSkillImpl implements Skill {
@Override
public void print() {
System.out.println("I can Python");
}
}
@RestController
@Lazy
public class ApiController {
@Autowired
Skill koaSkillImpl;
@RequestMapping("/getRust")
public String test(){
koaSkillImpl.print();
return "Welcome Rust's experience";
}
}
例子中有三個(gè)類,類都實(shí)現(xiàn)了ISkill接口,
api中用的是KoaSkillImpl,那么我命名成KobSkillImpl行不行?
當(dāng)我們這樣運(yùn)行時(shí),項(xiàng)目啟動(dòng)加載的時(shí)候是會(huì)報(bào)錯(cuò)了,其實(shí)服務(wù)名稱是對(duì)不上,那么解決方法
1.就是將這個(gè)命名改成類名的駝峰
2.就是在@service注解上加@service(“kobSkillImpl”)
3.我們看下@autowired其實(shí)是對(duì)Api的注入是不?我們有兩個(gè)主流的注入方法,一個(gè)是setter注入,一個(gè)是構(gòu)造函數(shù)注入不是?那我們就可以使用構(gòu)造函數(shù)注入的方式對(duì)api注入,取代@Autowired這個(gè)注解
@RestController
@Lazy
public class ApiController {
Skill javaSkillImpl;
ApiController(Skill javaSkillImpl){
this.javaSkillImpl=javaSkillImpl;
}
@RequestMapping("/getRust")
public String test(){
javaSkillImpl.print();
return "Welcome Rust's experience";
}
}
以上這篇在springboot中實(shí)現(xiàn)個(gè)別bean懶加載的操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀
這篇文章主要介紹了Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀,ReentrantLock中的lockInterruptibly()方法使得線程可以在被阻塞時(shí)響應(yīng)中斷,比如一個(gè)線程t1通過(guò)lockInterruptibly()方法獲取到一個(gè)可重入鎖,并執(zhí)行一個(gè)長(zhǎng)時(shí)間的任務(wù),需要的朋友可以參考下2023-12-12
maven項(xiàng)目pom.xml中parent標(biāo)簽的使用小結(jié)
使用maven是為了更好的幫項(xiàng)目管理包依賴,maven的核心就是pom.xml,當(dāng)我們需要引入一個(gè)jar包時(shí),在pom文件中加上就可以從倉(cāng)庫(kù)中依賴到相應(yīng)的jar包,本文就來(lái)介紹一下maven項(xiàng)目pom.xml中parent標(biāo)簽的使用小結(jié),感興趣的可以了解一下2023-12-12
SpringBoot集成Hadoop實(shí)現(xiàn)文件的上傳和下載功能
Spring?Hadoop簡(jiǎn)化了Apache?Hadoop,提供了一個(gè)統(tǒng)一的配置模型以及簡(jiǎn)單易用的API來(lái)使用HDFS、MapReduce、Pig以及Hive,這篇文章主要介紹了SpringBoot集成Hadoop實(shí)現(xiàn)文件的上傳和下載,需要的朋友可以參考下2024-07-07
Java經(jīng)緯度小數(shù)與度分秒相互轉(zhuǎn)換工具類示例詳解
這篇文章主要介紹了Java經(jīng)緯度小數(shù)與度分秒相互轉(zhuǎn)換工具類,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
Java數(shù)據(jù)結(jié)構(gòu)之KMP算法的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中KMP算法的原理與實(shí)現(xiàn),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下2022-11-11

