Spring Boot允许用户在加入Bean到IOC容器时做一些拦截操作,使用到的注解如下:
@ConditionalOnBean // 仅仅在当前上下文中存在某个对象时
@ConditionalOnClass // 某个class在claspath中
@ConditionalOnExpression // 当表达式为true的时候
@ConditionalOnMissingBean // 仅仅在当前上下文中不存在某个对象时
@ConditionalOnMissingClass // 某个class不在classpath中
@ConditionalOnNotWebApplication // 不是web应用
@ConditionalOnProperty // 当某个配置
但是有一点需要注意,这些注解没有将Bean加入到IOC容器的功能,也即不具备类似@Component注解的能力,所以还需要额外的注解或配置来将Bean加入到IOC容器中
ConditionalOnProperty
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnPropertyCondition.class})
public @interface ConditionalOnProperty {
// 属性名称数组,是prefix+name,所以不可与name同时出现
String[] value() default {};
// 属性名称前缀 如spring.x
String prefix() default "";
// 属性名称数组,结合上面prefix组成完整属性名称
String[] name() default {};
// 属性值是否与此值相同,相同才生效,不写就是TRUE才生效
String havingValue() default "";
// 属性不存在时是否加载,TRUE就是加载,FALSE是不加载
boolean matchIfMissing() default false;
}
实际使用
这里直接通过value指定了属性全名spring.cloud.nacos.discovery.enabled,由于没有写havingValue,所以只有当指定属性值为TRUE时才生效,又因为matchIfMissing=true,所以当你不配置spring.cloud.nacos.discovery.enabled时也生效。
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@ConditionalOnProperty(value = "spring.cloud.nacos.discovery.enabled",
matchIfMissing = true)
public @interface ConditionalOnNacosDiscoveryEnabled {
}