SpringBoot项目根据配置文件初始化并向容器注册Bean
前言
在开发过程种有这种场景,我们在使用数据存储的时候定义了一个接口,接口的实现有很多,例如有es的数据存储实现,mysql的数据存储实现,每个项目只能选择一种数据库。这个时候我们再写代码的时候就可以考虑在配置文件中配置一个数据库类型,启动的时候只对配置的数据库进行初始化,并向容器注册对应的bean
一、场景图示
描述:每个项目都有子集不同的配置,A项目配置了ES数据库,启动的时候我们根据A配置来实现数据处理接口的实现类为ES处理实现类(A类),则不初始化以及注册B、C两个类。其他同理。
二、实现
1.定义一个Condition实现类
定义Condition实现类的目的是获取配置文件配置,判断是否需要加载注入某个bean
public class MilvusBeanConditional implements Condition {
/**
* 是否初始化Milvus
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String dbServiceFlag = environment.getProperty("model.vector.dbType");
if (StringUtils.equals(dbServiceFlag, "Milvus")) {
return true;
} else {
return false;
}
}
}
public class EsBeanConditional implements Condition {
/**
* 是否初始化es
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String dbServiceFlag = environment.getProperty("model.vector.dbType");
if (StringUtils.equals(dbServiceFlag, "es")) {
return true;
} else {
return false;
}
}
}
public class MyssqlBeanConditional implements Condition {
/**
* 是否初始化Myssql
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String dbServiceFlag = environment.getProperty("model.vector.dbType");
if (StringUtils.equals(dbServiceFlag, "Myssql")) {
return true;
} else {
return false;
}
}
}
2.按照配置装配bean
更具上述定义的matches方法来实现是否需要装配某个bean,
@Conditional(MilvusBeanConditional.class) 可以用在方法上也可以用在类上
在数据库配置为Milvus数据库的时候,就会装配MilvusServiceClient并注入springboot容器
@Bean
@Conditional(MilvusBeanConditional.class) //根据MilvusBeanConditional类的matches方法来判断实现执行
public MilvusServiceClient milvusServiceClient() {
return new MilvusServiceClient(
ConnectParam.newBuilder()
.withUri(host + ":" + milvusPort)
.build());
}
总结
@Conditional注解这个注解在Spring4中引入,其主要作用就是判断条件是否满足,从而决定是否初始化并向容器注册Bean,自定义实现一个bean时只需要实现Condition接口中的matches方法即可。