在springboot中實(shí)現(xiàn)個(gè)別bean懶加載的操作
懶加載---就是我們在spring容器啟動的是先不把所有的bean都加載到spring的容器中去,而是在當(dāng)需要用的時(shí)候,才把這個(gè)對象實(shí)例化到容器中。
@Lazy
在需要懶加載的bean上加上@Lazy就可以了
補(bǔ)充知識:springboot組件懶加載的坑及加載規(guī)則
什么是懶加載?
懶加載的意思是不在項(xiàng)目啟動的時(shí)候?qū)嵗鰜磉@個(gè)組件
@RestControllerpublic class ApiController { @Autowired Skill kobSkillImpl; @RequestMapping('/getRust') public String test(){ kobSkillImpl.print(); return 'Welcome Rust’s experience'; }}
首先這是個(gè)api的代碼
@RestControllerpublic 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)記且啟動懶加載
@Service@Lazypublic class KoaSkillImpl implements Skill { KoaSkillImpl(){ System.out.println('Load KoaSkill Impl'); } @Override public void print() { System.out.println('I can KOA.js'); }}
在這里就能看到,在項(xiàng)目啟動的時(shí)候,這個(gè)z組件就已經(jīng)開始初始化了,這個(gè)說明什么?這個(gè)說明@lazy這個(gè)注解在現(xiàn)在是無效的。那么解決的方案是什么?
解決方案是在api層也要加個(gè)@lazy,也就是說被調(diào)用方是懶加載,但是調(diào)用方不是懶加載,最終還不會執(zhí)行懶加載。
我們在api層也加個(gè)@lazy,執(zhí)行項(xiàng)目發(fā)現(xiàn)沒有初始化輸出的內(nèi)容了。
那么,在懶加載的作用下,什么時(shí)候會初始化?
我們請求一下api的接口,發(fā)現(xiàn)控制臺已經(jīng)產(chǎn)生輸出,并且對這個(gè)類進(jìn)行了實(shí)例化,也就是說懶加載只在使用的時(shí)候進(jìn)行加載,項(xiàng)目啟動的時(shí)候不會對類實(shí)例化。
2.關(guān)于對service多實(shí)現(xiàn)類進(jìn)行加載
@Servicepublic class JavaSkillImpl implements Skill { @Override public void print() { System.out.println('I Can Java'); }}@Service@Lazypublic class KoaSkillImpl implements Skill { KoaSkillImpl(){ System.out.println('Load KoaSkill Impl'); } @Override public void print() { System.out.println('I can KOA.js'); }}@Servicepublic class PythonSkillImpl implements Skill { @Override public void print() { System.out.println('I can Python'); }}@RestController@Lazypublic 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)目啟動加載的時(shí)候是會報(bào)錯(cuò)了,其實(shí)服務(wù)名稱是對不上,那么解決方法
1.就是將這個(gè)命名改成類名的駝峰
2.就是在@service注解上加@service(“kobSkillImpl”)
3.我們看下@autowired其實(shí)是對Api的注入是不?我們有兩個(gè)主流的注入方法,一個(gè)是setter注入,一個(gè)是構(gòu)造函數(shù)注入不是?那我們就可以使用構(gòu)造函數(shù)注入的方式對api注入,取代@Autowired這個(gè)注解
@RestController@Lazypublic 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懶加載的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 解決Android Studio 格式化 Format代碼快捷鍵問題2. php解決注冊并發(fā)問題并提高QPS3. 完美解決vue 中多個(gè)echarts圖表自適應(yīng)的問題4. JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis5. Springboot 全局日期格式化處理的實(shí)現(xiàn)6. Java使用Tesseract-Ocr識別數(shù)字7. SpringBoot+TestNG單元測試的實(shí)現(xiàn)8. vue實(shí)現(xiàn)web在線聊天功能9. 在Chrome DevTools中調(diào)試JavaScript的實(shí)現(xiàn)10. Python使用urlretrieve實(shí)現(xiàn)直接遠(yuǎn)程下載圖片的示例代碼
