在Spring Boot中使用条件化的Bean -- 测试案例

在构建 spring boot 项目时,有时我们希望只有在满足某些条件时;,一些bean或模块才会被加载进应用上下文( application context )中。
Spring 为此引入了 @Conditional注解,方便我们为应用上下文的一部分提供自定义条件。Spring Boot 以此为基础,提供了一些预定义好的条件,避免我们重造轮子。

在Spring Boot中使用条件化的Bean

  1. 引入依赖
    <properties>
        <java.version>1.8</java.version>
        <springboot.version>2.1.8.RELEASE</springboot.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${springboot.version}</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>

    </dependencies>


  1. 案例代码
package morning.cat.springboot.condition;

import com.mysql.cj.jdbc.MysqlDataSource;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.*;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

@SpringBootApplication
public class SpringbootExampleConditionApplication {


    /**
     * 当 example.enabled 的值为 true 时加载 bean,默认为 false
     */
    @Bean
    @ConditionalOnProperty(value = "example.enabled", havingValue = "true", matchIfMissing = false)
    public String bean1() {
        return "Hello bean1";
    }

    /**
     * 当 example.enabled 和 morning.enabled 均为 true 是加载 bean ,冒号后面表示默认为 false ;
     */
    @Bean
    @ConditionalOnExpression("${example.enabled:false} and ${morning.enabled:false}")
    public String bean2() {
        return "Hello bean2";
    }

    /**
     * 在某个bean不存在时,才加载该 bean
     */
    @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        DataSource dataSource = new MysqlDataSource();
        return dataSource;
    }

    /**
     * 在某个 bean 存在时,才加载该 bean
     */
    @Bean
    @ConditionalOnBean(DataSource.class)
    public String bean3() {
        return "Hello bean3";
    }

    @Bean
    @ConditionalOnBean(name = "dataSource")
    public String bean4() {
        return "Hello bean4";
    }

    /**
     * 当某个类存在时,才加载该 bean
     */
    @Bean
    @ConditionalOnClass(name = "com.mysql.cj.jdbc.MysqlDataSource")
    public String bean5() {
        return "Hello bean5";
    }


    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = new SpringApplicationBuilder(SpringbootExampleConditionApplication.class)
                .web(WebApplicationType.NONE)
                .run(args);
//        String bean1 = applicationContext.getBean("bean1", String.class);
//        System.out.println("ConditionalOnProperty ----> " + bean1);
//
//        String bean2 = applicationContext.getBean("bean2", String.class);
//        System.out.println("ConditionalOnExpression ----> " + bean2);

//        String bean3 = applicationContext.getBean("bean3", String.class);
//        System.out.println("ConditionalOnBean ----> " + bean3);

//        String bean4 = applicationContext.getBean("bean4", String.class);
//        System.out.println("ConditionalOnBean ----> " + bean4);

        String bean5 = applicationContext.getBean("bean5", String.class);
        System.out.println("ConditionalOnExpression ----> " + bean5);
    }

}

  1. 配置文件 application.properties
example.enabled=true
morning.enabled=true

版权声明:本文为u013837825原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。