Spring Boot 自动配置之条件注解

栏目: Java · 发布时间: 5年前

内容简介: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
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Visual Thinking

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》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码