您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“SpringBoot自動(dòng)裝配的優(yōu)點(diǎn)有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
你需要編寫(xiě)很多的有關(guān)spring的xml。例如讀取屬性配置的bean、數(shù)據(jù)源bean、事務(wù)管理工廠bean、mybatis與spring整個(gè)的bean等等。再次利用該框架搭建項(xiàng)目的時(shí)候,又是周而復(fù)始的操作。
但是現(xiàn)在當(dāng)你使用springBoot搭建項(xiàng)目的時(shí)候,你會(huì)發(fā)現(xiàn)所有的配置你都不用去編寫(xiě)就可以幫你去實(shí)現(xiàn)(僅僅需要在連接外部數(shù)據(jù)庫(kù)的時(shí)候需要進(jìn)行配置,其實(shí)如果使用內(nèi)嵌數(shù)據(jù)庫(kù)h3 則你完全不必需要application.properties配置文件)。
你可以在你的具體的業(yè)務(wù)代碼中使用@AutoWried @Resource注解將數(shù)據(jù)源,事務(wù)工廠等注入到業(yè)務(wù)層,像是你自己配置那樣。
springBoot到底做了什么讓我們可以不用配置,而使用那些功能對(duì)象。
其實(shí)springBoot使用基于條件的自動(dòng)注入原理,即為當(dāng)滿(mǎn)足某個(gè)條件的時(shí)候,spring會(huì)實(shí)例化該注解對(duì)應(yīng)的bean,將其放入到Srping上下文中,讓你可以輕松的使用。SpringBoot實(shí)現(xiàn)條件配置離不開(kāi)它的核心組件@Conditional。
下面我們慢慢的來(lái)揭開(kāi)springBoot自動(dòng)配置的神秘面紗。
@Conditional 是個(gè)什么鬼,不解釋來(lái)個(gè)小的demo大致了解一下
描述一下demo場(chǎng)景 :Life實(shí)體bean在特定條件(@Conditional)下,被springBoot初始化,并放置到spring上下文環(huán)境中。
1.1、 Life 實(shí)體類(lèi)
/** * 夢(mèng)想存在,生命才有意義 */ public class Life { //工作 private String work; //學(xué)習(xí) private String study //愛(ài) private String love; //省略seter /geter }
1.2、 編寫(xiě)我們自己的條件匹配規(guī)則
/** * 實(shí)現(xiàn)ConfigurationCondition(該接口繼承了Condition) */ public class MyTestConditional implements ConfigurationCondition { /** * 設(shè)置使用該類(lèi)進(jìn)行解析的時(shí)機(jī) * 1、REGISTER_BEAN:會(huì)在注冊(cè)Bean的時(shí)候進(jìn)行condition的解析 * 即為在對(duì)應(yīng)的@Bean注解和@condition注解組合使用的時(shí)候 進(jìn)行條件的判斷 * @Bean注解對(duì)應(yīng)spring 的xml的<bean/>標(biāo)簽 * 2、PARSE_CONFIGURATION:會(huì)在解析@Configuration時(shí)進(jìn)行condition的解析 * 即為在對(duì)應(yīng)的@Configuration注解和@condition注解組合使用的時(shí)候 進(jìn)行條件的判斷 * @Configuration注解對(duì)應(yīng)spring 的xml的<beans/>標(biāo)簽 * @return */ @Override public ConfigurationPhase getConfigurationPhase() { return ConfigurationPhase.REGISTER_BEAN; } /** * 該方法為條件判斷的核心 只有該方法返回為true 則表示其條件成立 ,執(zhí)行相應(yīng)的配置 * @param conditionContext * @param annotatedTypeMetadata * @return */ @Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { return false; //表示驗(yàn)證不通過(guò) }
該類(lèi)實(shí)現(xiàn)了ConfigurationCondition 有如下兩個(gè)方法
1、 getConfigurationPhase() 該條件規(guī)則起作用的時(shí)候
2、 matches()條件匹配規(guī)則 這里為了演示不做具體的邏輯條件的處理
返回一個(gè)布爾值,如果為ture 則表示條件成立 配置生效
反之不生效。
1.3、編寫(xiě)我們的java實(shí)例bean自動(dòng)配置
@Configuration //@Configuration標(biāo)注在類(lèi)上,相當(dāng)于把該類(lèi)作為spring的xml配置文件中的<beans>, // 作用為:配置spring容器(應(yīng)用上下文) public class ServerAutoConfiguration { @Configuration //spring的xml配置文件中的<beans> //使用該注解表明,在springBoot啟動(dòng)的時(shí)候只有滿(mǎn)足MyTestConditional.class 才生成對(duì)應(yīng)的Life 對(duì)象 //即 MyTestConditional中的match()返回true @Bean生效 @Conditional(MyTestConditional.class) public static class StudentAutoConfiguration { @Bean public Life create() { System.out.println("life start...."); return new Life("努力工作","不斷的學(xué)習(xí)","敢愛(ài)敢恨"); } } }
1.4、 springBoot的單元測(cè)試
//使用Spring的單元測(cè)試環(huán)境 @RunWith(SpringRunner.class) //將SpringBoot的上下文環(huán)境加載進(jìn)入單元測(cè)試中 @SpringBootTest(classes = AutoApplication.class) public class AutoApplicationTests { //注入springBoot 基于條件的實(shí)例化bean @Autowired private Life life; @Test public void showlife() { System.out.println("生命的全部:"+life.toString()); } }
啟動(dòng)springBoot項(xiàng)目,在控制臺(tái)中沒(méi)有發(fā)現(xiàn)Life對(duì)象被創(chuàng)建 且單元測(cè)試中無(wú)法注入Life
在修改了MyTestConditional中的match() 返回true 再次啟動(dòng)則Life對(duì)象被創(chuàng)建
同時(shí)使用SpringBoot的單元測(cè)試來(lái)使用springBoot為我們?cè)O(shè)置的Life實(shí)體
該實(shí)體創(chuàng)建流程如下:當(dāng)springBoot項(xiàng)目啟動(dòng)的時(shí)候,會(huì)加載@Configuration(srping的xml配置)下的所有bean,當(dāng)遇到@Conditional(MyTestConditional.class) 會(huì)調(diào)用該方法的Match,并根據(jù)其返回值來(lái)判斷是否實(shí)例化該注解下的所有使用@Bean @Import 注解下的類(lèi)
(1)、@Conditional
官方文檔定義:
“Indicates that a component is only eligible for registration when all specified conditions match”
意思是只有滿(mǎn)足一些列條件之后創(chuàng)建一個(gè)bean。 并注冊(cè)到spring的上下文環(huán)境中
(2)、SpringBoot提供的
@ConditionalOnWebApplication
該應(yīng)用必須為web應(yīng)用
@ConditionalOnMissingBean
該應(yīng)用上下文中如果沒(méi)有指定的bean
@ConditionalOnBean
該應(yīng)用上下文中如果有指定的bean
@ConditionalOnProperty(name,value)
只有存在對(duì)應(yīng)name的value的配置文件才加載該注解下的bean
@ConditionalOnCloudPlatform
匹配當(dāng)處于云平臺(tái)環(huán)境中時(shí)后
@ConditionalOnClass
該classpath中如果有指定的bean @ConditionalOnExpression 如果對(duì)應(yīng)的表達(dá)式成立 成功
@ConditionalOnJava
根據(jù)應(yīng)用程序運(yùn)行的JVM版本進(jìn)行匹配 成功
@ConditionalOnRepositoryType
當(dāng)特定類(lèi)型的spring Data JPA啟用的時(shí)候 成功
@ConditionalOnSingleCandidate
當(dāng)特定的class對(duì)應(yīng)的bean存在且唯一確定的時(shí)候
@ConditionalOnJndi
通過(guò)JNDI查找制定的條件
@Profile
通過(guò)特定的條件觸發(fā) (生產(chǎn)環(huán)境使用該配置,非生產(chǎn)環(huán)境則不是使用)
@ConditionalOnResource
從資源文件中查詢(xún)
@ConditionalOnEnabledResourceChain
從資源鏈中中查詢(xún)
@ConditionalOnNotWebApplication
如果改應(yīng)用不是web應(yīng)用,則該條件起作用
@ConditionalOnMissingClass
如果不存在對(duì)應(yīng)的class則創(chuàng)建該對(duì)應(yīng)的bean
滿(mǎn)足條件后則加載該注解作用下的類(lèi)起作用
(3)、所謂該注解作用下的類(lèi)起作用是指
這些注解都有如下兩種使用方式
1、作用在類(lèi)上,則該類(lèi)下的所有@Bean注解起作用 (條件成立,加載該注解下的所有@Bean的實(shí)體類(lèi) 存放在spring上下文中)
2、作用在方法上 則該方法下對(duì)應(yīng)的@bean注解起作用 (條件成立,加載該注解下使用@Bean的實(shí)體類(lèi) 存放在spring上下文中)
與@Configuration或者@Bean配合使用,當(dāng)和@Configuration配合使用時(shí),
那么該類(lèi)下所有@Bean方法 或者@Import 或者 @ComponentScan都會(huì)受到其配置條件的影響
@Configuration
相當(dāng)于spring的xml配置文件的<beans>標(biāo)簽
@Bean
注解相當(dāng)于spring的xml配置文件的<bean>標(biāo)簽
@Import(Xxx.class)
將指定的class 實(shí)例注入到spring的上下文中
@Configuration
標(biāo)注在類(lèi)上,相當(dāng)于把該類(lèi)作為spring的xml配置文件中的<beans>,作用為:配置spring容器(應(yīng)用上下文)
結(jié)合demo 來(lái)設(shè)置一個(gè)自定義注解
(1)、 自定義注解
/* 自定義的Conditional 條件注解 */ @Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented @Conditional(MyTestConditional.class) public @interface ConditionalOnLife { Class<?>[] value() default {}; String[] name() default {};}
(2)、進(jìn)行配置使用
@Configuration //spring的xml配置文件中的<beans> //使用該注解表明,在springBoot啟動(dòng)的時(shí)候只有滿(mǎn)足MyTestConditional.class 才生成對(duì)應(yīng)的Life 對(duì)象 //自定義的條件注解 @ConditionalOnLife //@Conditional(MyTestConditional.class) public static class DreamAutoConfiguration { @Bean public Dream createDream() { //life.toString(); System.out.println("dream start...."); return new Dream(); } }
后臺(tái)調(diào)用成功創(chuàng)建了Dream實(shí)體 并放入spring上下文環(huán)境中
“SpringBoot自動(dòng)裝配的優(yōu)點(diǎn)有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。