SpringBoot Bean被加載時(shí)進(jìn)行控制
序章
簡介:bean的加載控制指根據(jù)特定情況對(duì)bean進(jìn)行選擇性加載以達(dá)到適用項(xiàng)目的目標(biāo)。
根據(jù)之前對(duì)bean加載的八種方式,其中后面四種是可以對(duì)bean被加載時(shí)進(jìn)行控制。
我拿第六種來舉個(gè)例子。
之前也舉過例子,但是實(shí)際開發(fā)呢,一般不會(huì)那么使用。
import org.springframework.context.annotation.ImportSelector; import org.springframework.core.type.AnnotationMetadata; public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { try { Class<?> name = Class.forName("yi.beans.kun"); if (name!=null){ return new String[]{"yi.beans.Cat"}; } }catch (ClassNotFoundException e){ return new String[0]; } return null; } }
通過查看某個(gè)類是否存在來控制是否加載目標(biāo)類。
這個(gè)類我是不存在的。
import org.springframework.context.annotation.Import; import yi.beans.MyImportSelector; @Import(MyImportSelector.class) public class AConfig { }
import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import yi.config.AConfig; public class App3 { public static void main(String[] args) { ApplicationContext context=new AnnotationConfigApplicationContext(AConfig.class); String[] names = context.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } } }
所以我是沒有加載這個(gè)bean的,還是老話,前面的那些暫時(shí)不看。
加載控制@Conditional派生注解
到了這里,你的spring項(xiàng)目就該換成springboot項(xiàng)目了,pom.xml中添加坐標(biāo),我就不多說了,這就是springboot的注解,源代碼中大量使用。
這是我未加控制前的代碼
import org.springframework.context.annotation.ComponentScan; @ComponentScan("yi.beans") public class AConfig { }
import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import yi.config.AConfig; public class App3 { public static void main(String[] args) { ApplicationContext context=new AnnotationConfigApplicationContext(AConfig.class); String[] names = context.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } } }
有貓,有狗,有老鼠,只不過我給他們都起了名字,你們很容易就會(huì)看出來。
現(xiàn)在我要對(duì)貓這個(gè)bean在創(chuàng)建時(shí)加一控制。
控制后
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication; import org.springframework.stereotype.Component; @ConditionalOnClass(Mouse.class) //要加載貓,必須要有老鼠這個(gè)bean @ConditionalOnBean(name = "zhizhi") //而且這個(gè)老鼠bean的名字必須是“zhizhi” @ConditionalOnMissingClass("yi.beans.Dog") //但是不能有狗,貓捉老鼠不想有狗 @ConditionalOnNotWebApplication //環(huán)境必須為非Web環(huán)境 @Component("miao") //貓的bean叫“miao” @Data @NoArgsConstructor @AllArgsConstructor public class Cat { String shout; }
這里我加了幾個(gè)常見的派生注解,其他的代碼都是不用變的,我的bean里賣雖然有一個(gè)叫做“zhizhi”的老鼠,但是有狗,所以貓是加載不出來的。
其中的
@ConditionalOnClass
@ConditionalOnBean
這兩個(gè)注解非常相似,一般就用上面那個(gè)控制類的字節(jié)碼或者路徑。下面那個(gè)獲取bean的名字,搭配使用就好了。
bean依賴的屬性配置
先定義兩個(gè)最基礎(chǔ)的bean
import lombok.Data; @Data public class Mouse { private String name; private int age; }
import lombok.Data; @Data public class Cat { private String name; private int age; }
cartoon:
cat:
name: "圖多蓋洛"
age: 5
mouse:
name: "泰菲"
age: 1
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @Data @ConfigurationProperties(prefix = "cartoon") public class CartoonProperties { private Cat cat; private Mouse mouse; }
import lombok.Data; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @Data @Component @EnableConfigurationProperties(CartoonProperties.class) public class CartoonCatAndMouse { private Cat cat; private Mouse mouse; private CartoonProperties cartoonProperties; public CartoonCatAndMouse(CartoonProperties cartoonProperties){ this.cartoonProperties=cartoonProperties; this.cat=new Cat(); this.cat.setName(cartoonProperties.getCat()!=null&& StringUtils.hasText(cartoonProperties.getCat().getName())? cartoonProperties.getCat().getName():"Tom"); this.cat.setAge(cartoonProperties.getCat()!=null&& cartoonProperties.getCat().getAge()!=0? cartoonProperties.getCat().getAge():6); this.mouse=new Mouse(); this.mouse.setName(cartoonProperties.getMouse()!=null&&StringUtils.hasText(cartoonProperties.getMouse().getName())? cartoonProperties.getMouse().getName():"Jerry"); this.mouse.setAge(cartoonProperties.getMouse()!=null && cartoonProperties.getMouse().getAge()!=0? cartoonProperties.getMouse().getAge():2); } public void play() { System.out.println(cat.getAge()+"歲的"+cat.getName()+"和"+mouse.getAge()+"歲的"+mouse.getName()+"打起來了"); } }
import com.yi.bean.CartoonCatAndMouse; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class SpringbootBean2ApplicationTests { @Autowired private CartoonCatAndMouse cartoonCatAndMouse; @Test void contextLoads() { cartoonCatAndMouse.play(); } }
可以看到加載的就是我們自己寫的配置,現(xiàn)在我把配置注解一部分,我們再來看運(yùn)行結(jié)果。
cartoon:
cat:
# name: "圖多蓋洛"
age: 5
mouse:
# name: "泰菲"
age: 1
可以看到,沒有寫的屬性使用的就是默認(rèn)屬性,也就是自動(dòng)配置的思想,只有在調(diào)用的時(shí)候才會(huì)生成bean,默認(rèn)的bean也不會(huì)在項(xiàng)目加載時(shí)就添加,這樣壓力會(huì)很大。如果我們沒有使用某個(gè)第三方的bean,我們的項(xiàng)目啟動(dòng)時(shí)也并不會(huì)加載默認(rèn)的bean。
到此這篇關(guān)于SpringBoot Bean被加載時(shí)進(jìn)行控制的文章就介紹到這了,更多相關(guān)SpringBoot Bean加載控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)整合微信支付方法詳解
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)整合微信支付的過程詳解,文中的示例代碼對(duì)我們的工作或?qū)W習(xí)有一定的幫助,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下2021-12-12Java獲取時(shí)間差(天數(shù)差,小時(shí)差,分鐘差)代碼示例
這篇文章主要介紹了Java獲取時(shí)間差(天數(shù)差,小時(shí)差,分鐘差)代碼示例,使用SimpleDateFormat來實(shí)現(xiàn)的相關(guān)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11java 實(shí)現(xiàn)增量同步和自定義同步的操作
這篇文章主要介紹了java 實(shí)現(xiàn)增量同步和自定義同步的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01Spring Boot實(shí)現(xiàn)簡單的定時(shí)任務(wù)
這篇文章主要給大家介紹了關(guān)于利用Spring Boot實(shí)現(xiàn)簡單的定時(shí)任務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07單點(diǎn)登錄的概念及SpringBoot實(shí)現(xiàn)單點(diǎn)登錄的操作方法
在本文中,我們將使用Spring Boot構(gòu)建一個(gè)基本的單點(diǎn)登錄系統(tǒng),我們將介紹如何使用Spring Security和JSON Web Tokens(JWTs)來實(shí)現(xiàn)單點(diǎn)登錄功能,本文假設(shè)您已經(jīng)熟悉Spring Boot和Spring Security,感興趣的朋友一起看看吧2024-10-10