自勉,持续学习,@Conditional使用记录
需求:根据不同部署参数加载不同的代码逻辑
例如:业务区分国内和国外,两套代码有各自的不同之处。但是希望能通过一套代码实现。
先上代码:
- 通过system api 获取部署参数,然后提供两个方法,对参数进行简单的判断。
public class MyEnvConfig {
private static final String IS_OVERSEAS = System.getenv("isOverseas"); // 获取部署参数
public static boolean isOverseas() {
return "yes".equalsIgnoreCase(IS_OVERSEAS);
}
public static boolean isChinese() {
return "no".equalsIgnoreCase(IS_OVERSEAS);
}
}
- 自定义两个 condition 类实现 org.springframework.context.annotation
@Component
public class OverseasCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return MyEnvConfig.isOverseas();
}
}
@Component
public class ChineseCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return MyEnvConfig.isChinese();
}
}
- 最后我们通过@Conditional注解动态加载相关代码:
@Conditional(OverseasCondition.class)
public class OverseasLogic {
//todo 国外的逻辑
}
@Conditional(ChineseCondition.class)
public class ChineseLogic {
//todo 国内的逻辑
}
简单解释
项目部署时,读取到@Conditional注解,然后判断注解的括号中的类是否符合条件。如果符合(返回true)则加载该类,执行对应的方法,否则不加载该类。