我们在pom文件中添加依赖
4.0.0
org.example
Condition
1.0-SNAPSHOT
8
8
org.springframework
spring-context
6.0.3
/**
* @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注解来实现根据条件返回对象。
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());
}
}