• 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"));
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.编写自定义注解

    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Conditional(TestOnCondition.class)
    public @interface TestConditional {
        String value() default "";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    测试:

    @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");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    结果
    在这里插入图片描述

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

  • 相关阅读:
    使用 diffusers 训练你自己的 ControlNet 🧨
    李沐大神动手学深度学习——学习笔记(连载)
    Map和Set(下)
    学会这 29 个 函数,你就是 Pandas 专家
    面试常问:数组拍平(扁平化)实现
    SpringCloud 04 Eureka 服务注册和发现
    简简单单搞一个实用的Android端搜索框
    QT基础入门【QSS】 伪状态,冲突解决、级联介绍
    【金三银四】Java基础知识面试题(2021最新版)
    vue课程80 演示如何利用cli创建项目
  • 原文地址:https://blog.csdn.net/qq_44732146/article/details/126836396