前言
当一个接口有多个实现类时,启动spring容器根据条件来加载其中的某一个作为实现类,应该如何实现呢?
其实这种情况对于策略模式很有效,下面来看一下如何具体实现。
DEMO
1、定义一个接口
package com.example.springbootTest;
/**
* @author txb
* @DESCRIPTION
* @create 2019/2/27
*/
public interface EncodingConvert {
}
2、定义2个实现类
其一:
package com.example.springbootTest;
/**
* @author txb
* @DESCRIPTION
* @create 2019/2/27
*/
public class GBKEncodingConvert implements EncodingConvert {
}
其二:
package com.example.springbootTest;
/**
* @author txb
* @DESCRIPTION
* @create 2019/2/27
*/
public class UTFEncodingConvert implements EncodingConvert {
}
3、定义配置类
@SpringBootConfiguration
public class EncodingConfig {
@Bean
@Conditional(UTFCondition.class)
public EncodingConvert createUTF(){
return new UTFEncodingConvert();
}
@Bean
@Conditional({GBKCondition.class})
public EncodingConvert createGBK(){
return new GBKEncodingConvert();
}
}
4、定义Condition(返回true则加载)
其一:
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class GBKCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
String encoding= System.getProperty("file.encoding");
if(encoding!=null){
return "gbk".equals(encoding.toLowerCase());
}
return false;
}
}
其二:
public class UTFCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
String encoding= System.getProperty("file.encoding");
if(encoding!=null){
return "utf".equals(encoding.toLowerCase());
}
return false;
}
}
说明:
配置类中添加了@Conditional的注解,说明在加载这个方法的时候,需要去判断相应的Condition(条件),如果返回true,则运行此方法。同样@Conditional也可以放在类上面,是同样的道理(则对其下所有方法都适用)。
注意:@Conditional可以传递多个参数:@Conditional({UTFCondition.class, GBKCondition.class})
推荐一个公众号,免费领架构师学习资料,每周更新优质文章,能学到很多。