开发过程中经常用到自定义条件注解,今天记录一个这个常用的小技巧:
需求是当某些属性存在的时候,才能注入Bean
第一步:
实现Condition接口 注意是
import org.springframework.context.annotation.Condition;
这个包下面的
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
import java.util.Map;
/**
*
* 类 名 称:Mycondition
* 类 描 述:自定义条件注解
*
*/
public class Mycondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
// 或粗自定义条件注解的全部属性
Map<String, Object> map = annotatedTypeMetadata.getAnnotationAttributes(ConditionalCustom.class.getName());
// 获取注解的value属性值 String[] 数组
String[] values = (String[]) map.get("value");
Environment env = conditionContext.getEnvironment();
//遍历每个属性值
for (String val : values) {
//如果某个属性值对相应的配置属性不存在,则返回false
if(env.getProperty(val) == null){
return false;
}
}
return true;
}
}
第二步:
自定义条件注解:
import org.springframework.context.annotation.Conditional;
import java.lang.annotation.*;
/**
*
* 类 名 称:ConditionalCustom
* 类 描 述:自定义条件注解
*
*
*/
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(Mycondition.class)
public @interface ConditionalCustom {
String[] value() default {};
}
第三步:
使用自定义条件注解:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.text.DateFormat;
@Configuration
public class MyCustomeConfig {
@Bean
// 只用 test.name,test.age 这个两个属性都存在时才生效
@ConditionalCustom({"test.name","test.age"})
public DateFormat dateFormat(){
return DateFormat.getDateInstance();
}
}
第四步:
启动服务检查:
@SpringBootApplication
public class SpringbootStudyApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringbootStudyApplication.class, args);
DateFormat dateFormat = (DateFormat)applicationContext.getBean("dateFormat");
System.out.println(dateFormat);
}
}
如果配置为文件中配置有:test.name test.age 属性则控制台输出:
否则:
以上就是使用过程。