javascript
Spring Boot 自动配置之条件注解
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
Spring Boot 神奇的自動配置,主要依靠大量的條件注解來使用配置自動化。
根據(jù)滿足某一個特定條件創(chuàng)建一個特定的Bean。比如說,在某些系統(tǒng)變量下創(chuàng)建Bean,或者只有在某個Bean創(chuàng)建后才去創(chuàng)建另外一個Bean. 就是根據(jù)條件來控制Bean的創(chuàng)建行為,可以利用該特性來進(jìn)行一些自動配置。
一、常用的條件注解
- @Conditional 依賴的條件
- @ConditionalOnBean 在某個Bean存在的條件下
- @ConditionalOnMissingBean 在某個Bean不存在的條件下
- @ConditionalOnClass 在某個Class存在的條件下
- @ConditionalOnMissingClass 在某個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 接口是一個函數(shù)式接口
@FunctionalInterface public interface Condition {boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata); }三、條件注解示例
示例場景:項(xiàng)目中動態(tài)的配置Mysql或者Oracle數(shù)據(jù)源
1. 定義配置文件
db-type=oracle2. 定義Condition類
MySqlCondition.java
public class MySqlCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return "mysql".equals(context.getEnvironment().getProperty("db-type"));} }OracleCondition.java
public class OracleCondition implements Condition {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic void create() {System.out.println("mysql 。。 create");} }7. 測試
@Resource private JdbcFactory jdbcFactory;@Test public void conditionOnMissBean() {jdbcFactory.create(); }結(jié)果:
mysql 。。 create8.解析
當(dāng)環(huán)境中不存在 JdbcFactory 的Bean時則使用默認(rèn)的實(shí)現(xiàn)的方式,如例:沒有自定義實(shí)現(xiàn)時,則默認(rèn)使用MySqlDefaultFactory。這在自動化配置中會經(jīng)常用到。比如redisTemplate 的默認(rèn)實(shí)現(xiàn)
四、GitHub源碼
源碼地址
轉(zhuǎn)載于:https://my.oschina.net/u/3555293/blog/3012166
總結(jié)
以上是生活随笔為你收集整理的Spring Boot 自动配置之条件注解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于django的视频点播网站开发-st
- 下一篇: css学习笔记2--多重边框