@Conditional的作用
@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
Class<? extends Condition>[] value();
}
@FunctionalInterface
public interface Condition {
//根据返回的true 或者 false p判断是否注入对象
boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
@Conditional的使用
以下案例来自nacos中的使用场景:用来区分单机环境和集群环境
//该接口有两个实现类
public interface CommonPersistService {
void findTenantByKp();
}
//实现类1
@Conditional(value = ConditionOnExternalStorage.class)
@Service("externalOtherPersistServiceImpl")
public class ExternalCommonPersistServiceImpl implements CommonPersistService {
void findTenantByKp(){
System.out.println("实现类1打印了-----");
}
}
public class ConditionOnExternalStorage implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return true;
}
}
//实现类2
@Conditional(value = ConditionOnEmbeddedStorage.class)
@Service("embeddedOtherPersistServiceImpl")
public class EmbeddedCommonPersistServiceImpl implements CommonPersistService {
void findTenantByKp(){
System.out.println("实现类2打印了-----");
}
}
public class ConditionOnEmbeddedStorage implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return false;
}
}
//使用
@Service
public class NamespaceOperationService {
@resource
private CommonPersistService commonPersistService;
public List<Namespace> getNamespaceList() {
commonPersistService.findTenantByKp();
}
}
结果:实现类1打印了-----
因为实现类的@Conditional条件注解中的实现方法返回的true