在构建 spring boot 项目时,有时我们希望只有在满足某些条件时;,一些bean或模块才会被加载进应用上下文( application context )中。
Spring 为此引入了 @Conditional注解,方便我们为应用上下文的一部分提供自定义条件。Spring Boot 以此为基础,提供了一些预定义好的条件,避免我们重造轮子。
- 引入依赖
<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>
- 案例代码
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);
}
}
- 配置文件 application.properties
example.enabled=true
morning.enabled=true
版权声明:本文为u013837825原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。