Spring Boot 自動(dòng)配置之條件注解淺析
Spring Boot 神奇的自動(dòng)配置,主要依靠大量的條件注解來使用配置自動(dòng)化。
根據(jù)滿足某一個(gè)特定條件創(chuàng)建一個(gè)特定的Bean。比如說,在某些系統(tǒng)變量下創(chuàng)建Bean,或者只有在某個(gè)Bean創(chuàng)建后才去創(chuàng)建另外一個(gè)Bean. 就是根據(jù)條件來控制Bean的創(chuàng)建行為,可以利用該特性來進(jìn)行一些自動(dòng)配置。
一、常用的條件注解
- @Conditional 依賴的條件
- @ConditionalOnBean 在某個(gè)Bean存在的條件下
- @ConditionalOnMissingBean 在某個(gè)Bean不存在的條件下
- @ConditionalOnClass 在某個(gè)Class存在的條件下
- @ConditionalOnMissingClass 在某個(gè)Class不存在的條件下
比較常見的是這些注解,還有其它的比如 @ConditionalOnWebApplication,@ConditionalOnProperty 等,可舉一反三
二、特別說明 @Conditional 注解
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Conditional { /** * All {@link Condition Conditions} that must {@linkplain Condition#matches match} * in order for the component to be registered. */ Class<? extends Condition>[] value(); }
使用@Conditional注解,對象需要實(shí)現(xiàn)Condition接口,Condition 接口是一個(gè)函數(shù)式接口
@FunctionalInterface public interface Condition { boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata); }
三、條件注解示例
示例場景:項(xiàng)目中動(dòng)態(tài)的配置Mysql或者Oracle數(shù)據(jù)源
1. 定義配置文件
db-type=oracle
2. 定義Condition類
MySqlCondition.java
public class MySqlCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return "mysql".equals(context.getEnvironment().getProperty("db-type")); } }
OracleCondition.java
public class OracleCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return "oracle".equals(context.getEnvironment().getProperty("db-type")); } }
獲取配置文件db-type的值
3. JdbcFactory接口
public interface JdbcFactory { void create(); }
4. 默認(rèn)的Mysql和Oracle實(shí)現(xiàn)
Mysql
@ConditionalOnMissingBean(value = JdbcFactory.class, ignored = MySqlDefaultFactory.class) @Conditional(MySqlCondition.class) @Component public class MySqlDefaultFactory implements JdbcFactory { @Override public void create() { System.out.println("Default MySql create .."); } }
Oracle
@ConditionalOnMissingBean(value = JdbcFactory.class, ignored = OracleDefaultFactory.class) @Conditional(OracleCondition.class) @Component public class OracleDefaultFactory implements JdbcFactory { @Override public void create() { System.out.println("Default oracle create.."); } }
5. 測試默認(rèn)實(shí)現(xiàn)方式
@Resource private JdbcFactory jdbcFactory; @Test public void conditionOnMissBean() { jdbcFactory.create(); }
結(jié)果:Default MySql create ..
6. 自定義實(shí)現(xiàn)方式
@Component public class MysqlFactory implements JdbcFactory { @Override public void create() { System.out.println("mysql 。。 create"); } }
7. 測試
@Resource private JdbcFactory jdbcFactory; @Test public void conditionOnMissBean() { jdbcFactory.create(); }
結(jié)果:mysql 。。 create
8.解析
當(dāng)環(huán)境中不存在 JdbcFactory 的Bean時(shí)則使用默認(rèn)的實(shí)現(xiàn)的方式,如例:沒有自定義實(shí)現(xiàn)時(shí),則默認(rèn)使用MySqlDefaultFactory。這在自動(dòng)化配置中會(huì)經(jīng)常用到。比如redisTemplate 的默認(rèn)實(shí)現(xiàn)
四、GitHub源碼
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java文件復(fù)制代碼片斷(java實(shí)現(xiàn)文件拷貝)
本文介紹java實(shí)現(xiàn)文件拷貝的代碼片斷,大家可以直接放到程序里運(yùn)行2014-01-01Linux下用java -jar運(yùn)行可執(zhí)行jar包的方法教程
這篇文章主要給大家介紹了在Linux下用java -jar運(yùn)行可執(zhí)行jar包的方法教程,文中介紹的非常詳細(xì),相信對大家的工作或者學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05Spring中的ImportBeanDefinitionRegistrar接口詳解
這篇文章主要介紹了Spring中的ImportBeanDefinitionRegistrar接口詳解,ImportBeanDefinitionRegistrar接口是也是spring的擴(kuò)展點(diǎn)之一,它可以支持我們自己寫的代碼封裝成BeanDefinition對象,注冊到Spring容器中,功能類似于注解@Service @Component,需要的朋友可以參考下2023-09-09解決Maven 項(xiàng)目報(bào)錯(cuò) java.httpservlet和synchronized使用方法
下面小編就為大家?guī)硪黄鉀QMaven 項(xiàng)目報(bào)錯(cuò) java.httpservlet和synchronized使用方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07SpringBoot中@EnableAsync和@Async注解的使用小結(jié)
在SpringBoot中,可以通過@EnableAsync注解來啟動(dòng)異步方法調(diào)用的支持,通過@Async注解來標(biāo)識(shí)異步方法,讓方法能夠在異步線程中執(zhí)行,本文就來介紹一下,感興趣的可以了解一下2023-11-11Spring MVC簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Spring MVC屬于SpringFrameWork的后續(xù)產(chǎn)品,已經(jīng)融合在Spring Web Flow里面。今天先從寫一個(gè)Spring MVC的HelloWorld開始,讓我們看看如何搭建起一個(gè)Spring mvc的環(huán)境并運(yùn)行程序,感興趣的朋友一起學(xué)習(xí)吧2017-08-08java注解的類型知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理了一篇關(guān)于java注解的類型知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-03-03Java Spring Security認(rèn)證與授權(quán)及注銷和權(quán)限控制篇綜合解析
Spring Security 是 Spring 家族中的一個(gè)安全管理框架,實(shí)際上,在 Spring Boot 出現(xiàn)之前,Spring Security 就已經(jīng)發(fā)展了多年了,但是使用的并不多,安全管理這個(gè)領(lǐng)域,一直是 Shiro 的天下2021-10-10Apache POI將PPT轉(zhuǎn)換成圖片實(shí)例代碼
這篇文章主要介紹了Apache POI將PPT轉(zhuǎn)換成圖片實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01