在springboot中實現(xiàn)個別bean懶加載的操作
懶加載---就是我們在spring容器啟動的是先不把所有的bean都加載到spring的容器中去,而是在當(dāng)需要用的時候,才把這個對象實例化到容器中。
@Lazy
在需要懶加載的bean上加上@Lazy就可以了
補充知識:springboot組件懶加載的坑及加載規(guī)則
什么是懶加載?
懶加載的意思是不在項目啟動的時候?qū)嵗鰜磉@個組件
@RestController public class ApiController { @Autowired Skill kobSkillImpl; @RequestMapping("/getRust") public String test(){ kobSkillImpl.print(); return "Welcome Rust's experience"; } }
首先這是個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)容以便我們知道它是什么時候加載的,我們使用了@lazy注解,標(biāo)記且啟動懶加載
@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"); } }
在這里就能看到,在項目啟動的時候,這個z組件就已經(jīng)開始初始化了,這個說明什么?這個說明@lazy這個注解在現(xiàn)在是無效的。那么解決的方案是什么?
解決方案是在api層也要加個@lazy,也就是說被調(diào)用方是懶加載,但是調(diào)用方不是懶加載,最終還不會執(zhí)行懶加載。
我們在api層也加個@lazy,執(zhí)行項目發(fā)現(xiàn)沒有初始化輸出的內(nèi)容了。
那么,在懶加載的作用下,什么時候會初始化?
我們請求一下api的接口,發(fā)現(xiàn)控制臺已經(jīng)產(chǎn)生輸出,并且對這個類進行了實例化,也就是說懶加載只在使用的時候進行加載,項目啟動的時候不會對類實例化。
2.關(guān)于對service多實現(xià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"; } }
例子中有三個類,類都實現(xiàn)了ISkill接口,
api中用的是KoaSkillImpl,那么我命名成KobSkillImpl行不行?
當(dāng)我們這樣運行時,項目啟動加載的時候是會報錯了,其實服務(wù)名稱是對不上,那么解決方法
1.就是將這個命名改成類名的駝峰
2.就是在@service注解上加@service(“kobSkillImpl”)
3.我們看下@autowired其實是對Api的注入是不?我們有兩個主流的注入方法,一個是setter注入,一個是構(gòu)造函數(shù)注入不是?那我們就可以使用構(gòu)造函數(shù)注入的方式對api注入,取代@Autowired這個注解
@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中實現(xiàn)個別bean懶加載的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Springcloud?feign傳日期類型參數(shù)報錯的解決方案
這篇文章主要介紹了Springcloud?feign傳日期類型參數(shù)報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03SpringBoot使用攔截器Interceptor實現(xiàn)統(tǒng)一角色權(quán)限校驗
角色權(quán)限校驗,是保證接口安全必備的能力:有權(quán)限才可以操作,所以,一般對于這種通用邏輯,推薦不與主業(yè)務(wù)邏輯耦合,那么怎么來解耦,那么本文小編就給大家詳細講解如何使用攔截器Interceptor實現(xiàn)統(tǒng)一角色權(quán)限校驗,需要的朋友可以參考下2023-07-07Java回調(diào)函數(shù)原理實例與代理模式的區(qū)別講解
今天小編就為大家分享一篇關(guān)于Java回調(diào)函數(shù)原理實例與代理模式的區(qū)別講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02Java?SE使用for?each循環(huán)遍歷數(shù)組的方法代碼
在Java?SE開發(fā)中,數(shù)組是最常見的數(shù)據(jù)結(jié)構(gòu)之一,Java提供了多種遍歷數(shù)組的方式,其中for循環(huán)是最常用的方式之一,本文將介紹如何使用for?each循環(huán)遍歷數(shù)組,接下來,我們將通過一個簡單的代碼示例來展示如何使用for?each循環(huán)遍歷數(shù)組,需要的朋友可以參考下2023-11-11