一、创建一个Maven项目
我们在pom文件中添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Condition</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--引入spring-context-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.3</version>
</dependency>
</dependencies>
</project>
二、定义接口和实现类
/**
* @author qinxun
* @date 2023-06-15
* @Descripion: 数据库接口
*/
public interface Database {
String getName();
}
/**
* @author qinxun
* @date 2023-06-15
* @Descripion: mysql
*/
public class MySQL implements Database {
@Override
public String getName() {
return "当前使用mysql数据库";
}
}
/**
* @author qinxun
* @date 2023-06-15
* @Descripion: oracle
*/
public class Oracle implements Database {
@Override
public String getName() {
return "当前使用oracle数据库";
}
}
三、创建各自的条件类
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import java.util.Objects;
/**
* @author qinxun
* @date 2023-06-15
* @Descripion: mySQL条件类
*/
public class MySQLCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return Objects.equals(context.getEnvironment().getProperty("DatabaseName"), "mysql");
}
}
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import java.util.Objects;
/**
* @author qinxun
* @date 2023-06-15
* @Descripion: Oracle条件类
*/
public class OracleCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return Objects.equals(context.getEnvironment().getProperty("DatabaseName"), "oracle");
}
}
四、配置两个类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
/**
* @author qinxun
* @date 2023-06-15
* @Descripion: 数据库配置
*/
@Configuration
public class DbConfig {
/**
* Mysql条件成立时使用Mysql的数据
*/
@Bean("database")
@Conditional(MySQLCondition.class)
Database mysql() {
return new MySQL();
}
/**
* Oracle条件成立时使用Oracle的数据
*/
@Bean("database")
@Conditional(OracleCondition.class)
Database oracle() {
return new Oracle();
}
}
两个Bean的名称都是一样的,说明两个Bean的返回值都是父类对象Database。
每个Bean上都多了@Conditional注解,当注解中的条件为true时,对应的Bean就会生效。
五、测试
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author qinxun
* @date 2023-06-15
* @Descripion: 测试
*/
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
// 传入我们需要的参数
ctx.getEnvironment().getSystemProperties().put("DatabaseName", "mysql");
ctx.register(DbConfig.class);
ctx.refresh();
Database database = (Database) ctx.getBean("database");
// 输出 当前使用mysql数据库
System.out.println(database.getName());
}
}
六、@Profile注解
我们使用@Profile注解来实现根据条件返回对象。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
/**
* @author qinxun
* @date 2023-06-15
* @Descripion: 数据库配置
*/
@Configuration
public class DbConfig {
/**
* Mysql条件成立时使用Mysql的数据
*/
@Bean("database")
//@Conditional(MySQLCondition.class)
@Profile("mysql")
Database mysql() {
return new MySQL();
}
/**
* Oracle条件成立时使用Oracle的数据
*/
@Bean("database")
// @Conditional(OracleCondition.class)
@Profile("oracle")
Database oracle() {
return new Oracle();
}
}
测试:
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author qinxun
* @date 2023-06-15
* @Descripion: 测试
*/
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
// 传入我们需要的参数
//ctx.getEnvironment().getSystemProperties().put("DatabaseName", "mysql");
ctx.getEnvironment().setActiveProfiles("oracle");
ctx.register(DbConfig.class);
ctx.refresh();
Database database = (Database) ctx.getBean("database");
// 输出 当前使用oracle数据库
System.out.println(database.getName());
}
}