SpringBoot 条件注解之:自定义条件注解

SpringBoot 常用条件注解

注解条件断类备注
@ConditionalOnClassOnClassCondition如果Classpath 存在匹配到class,就创建
@ConditionalOnMissingClassOnClassCondition如果Classpath 不存在匹配到class,就创建
@ConditionalOnBeanOnBeanCondition如果Spring容器中 存在匹配到Bean,就创建
@ConditionalOnMissingBeanOnBeanCondition如果Spring容器 存在匹配到Bean,就创建
@ConditionalOnPropertyOnPropertyCondition如果Spring容器 存在匹配到属性,就创建
@ConditionalOnResourceOnResourceCondition如果ClassPath下存在匹配到resource,就创建
@ConditionalOnWebApplicationOnWebApplicationCondition如果应用类型不满足type(ANY、SERVLET、REACTIVE),就创建
@ConditionalOnNotWebApplicationOnWebApplicationCondition如果应用类型不满足type(ANY、SERVLET、REACTIVE),就创建
@ConditionalOnExpressionOnExpressionCondition基于SpringEL表达式进行判断,如果true就创建

自定义条件注解

1.编写条件Class继承Condition或者Condition子类SpringBootCondition

public class TestOnCondition extends SpringBootCondition {
    private String defaultValue = "test";

    @Override
    //关键点:实现业务逻辑判断
    public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Map<String, Object> map = metadata.getAnnotationAttributes(TestConditional.class.getName());
        String value = String.valueOf(map.get("value"));
        if (defaultValue.equals(value)) {
            return ConditionOutcome.match(ConditionMessage.forCondition(TestConditional.class)
                    .because("match"));
        } else {
            return ConditionOutcome.noMatch(ConditionMessage.forCondition(TestConditional.class)
                    .because("not match"));
        }
    }
}

2.编写自定义注解

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(TestOnCondition.class)
public @interface TestConditional {
    String value() default "";
}

3.实体类

public class Greeting {
    private final long id;
    private final String content;

    public Greeting(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}

测试:

@SpringBootApplication
public class Demo01Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Demo01Application.class, args);
        Object test = context.getBean("greeting");
        System.out.println(test);
    }
    @Bean
    @TestConditional("test")
    public Greeting greeting(){
        return new Greeting(1,"test");
    }

}

结果
在这里插入图片描述

把@TestConditional(“test”)改成@TestConditional(“test1”)
在这里插入图片描述
结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值