1. 功能描述
可以根据配置控制bean是否初始化,类似springboot中org.springframework.boot.autoconfigure.condition.ConditionalOnProperty注解的作用
2. 代码
2.1 添加注解
package com.fh.hzbase.conditional;
import org.springframework.context.annotation.Conditional;
import java.lang.annotation.*;
/**
* @author pp_lan
* @description
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Conditional({PropertiesCondition.class})
public @interface CustomConditionalOnProperty {
String name();
String havingValue();
}
2.2 过滤器Condition
此实现以根据spring容器中的参数为准,自定义Condition可以灵活根据业务进行控制
package com.fh.hzbase.conditional;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import java.util.Map;
import java.util.Objects;
/**
* @author pp_lan
* @description
*/
public class PropertiesCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
Map<String, Object> annotationAttributes = annotatedTypeMetadata.getAnnotationAttributes(CustomConditionalOnProperty.class.getName());
String name = String.valueOf(annotationAttributes.get("name"));
// 期望值
String expectedValue = String.valueOf(annotationAttributes.get("havingValue"));
// 当前值
String value = conditionContext.getEnvironment().getProperty(name);
return Objects.equals(expectedValue, value);
}
}
3. 使用示例
package com.fh.hzbase.client.proxy;
import com.fh.hzbase.conditional.CustomConditionalOnProperty;
@Component
@CustomConditionalOnProperty(name = "rpc.register.type", havingValue = "1")
public class ServiceProxy {
}