内容简介:Spring Boot 神奇的自动配置,主要依靠大量的条件注解来使用配置自动化。根据满足某一个特定条件创建一个特定的Bean。比如说,在某些系统变量下创建Bean,或者只有在某个Bean创建后才去创建另外一个Bean. 就是根据条件来控制Bean的创建行为,可以利用该特性来进行一些自动配置。比较常见的是这些注解,还有其它的比如 @ConditionalOnWebApplication, @ConditionalOnProperty 等,可举一反三
Spring Boot 神奇的自动配置,主要依靠大量的条件注解来使用配置自动化。
根据满足某一个特定条件创建一个特定的Bean。比如说,在某些系统变量下创建Bean,或者只有在某个Bean创建后才去创建另外一个Bean. 就是根据条件来控制Bean的创建行为,可以利用该特性来进行一些自动配置。
一、常用的条件注解
- @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注解,对象需要实现Condition接口,Condition 接口是一个函数式接口
@FunctionalInterface public interface Condition { boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata); } 复制代码
三、条件注解示例
示例场景:项目中动态的配置 Mysql 或者Oracle数据源
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. 默认的Mysql和Oracle实现
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. 测试默认实现方式
@Resource private JdbcFactory jdbcFactory; @Test public void conditionOnMissBean() { jdbcFactory.create(); } 复制代码
结果:
Default MySql create .. 复制代码
6. 自定义实现方式
@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(); } 复制代码
结果:
mysql 。。 create 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- SpringBoot基础篇Bean之条件注入之注解使用
- SQL where条件和jion on条件的详解及区别
- Python 条件语句
- React 行内条件渲染
- Golang: 条件和循环
- 漫谈条件随机场
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Visual Thinking
Colin Ware / Morgan Kaufmann / 2008-4-18 / USD 49.95
Increasingly, designers need to present information in ways that aid their audiences thinking process. Fortunately, results from the relatively new science of human visual perception provide valuable ......一起来看看 《Visual Thinking》 这本书的介绍吧!