zoukankan      html  css  js  c++  java
  • Spring Boot conditional注解介绍

    1、conditional注解介绍

    含义: 基于条件的注解

    作用: 根据是否满足某一个特定条件来决定是否创建某个特定的bean

    意义: Springboot实现自动配置的关键基础能力

    2、常见conditional注解

    @ConditionalOnBean   框架中存在某个Bean时生效

    @ConditionalOnMissingBean 在Bean不存在时生效

    @ConditionalOnClass   框架中存在某个Class时生效

    @ConditionalOnMissingClass  在Class不存在时生效

    @ConditionalOnWebApplication   当前是web环境

    @ConditionalOnNotWebApplication  当前不是web环境

    @ConditionalOnProperty  当前框架中是否包含特定的属性

    @ConditionalOnJava 当前是否存在某个Java版本

    3、Conditional的使用

    1) 创建A.java,增加注解ConditionalOnProperty,表示系统中有这个属性才实例化A

    @Component
    @ConditionalOnProperty("com.example.condition")
    public class A {
    }
    

      

    2) 创建测试类

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Import(MyBeanImport.class)
    public class ConditionTest implements ApplicationContextAware {
    
        private ApplicationContext applicationContext;
    
    
        @Test
        public void testA() {
            System.out.println(applicationContext.getBean(A.class));
        }
    
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    }
    

      

    3、运行测试类

    抛出异常,表示没有找到A这个类。

    然后在application.properties文件中增加属性

     再次运行测试。成功。

    4、A类中有个注解ConditionOnProperty

     1) 进入注解ConditionOnProperty。里面有一个@Conditional注解

     

    2) 进入@Conditional注解。里面的value是Class类型,并且继承自Condition接口

    3) 进入Condition接口。里面只有一个方法。当这个方法返回true时,这个bean才会注入到容器当中。

    5、自定义Conditional 注解

    1) 创建MyCondition类。实现Condition接口重写matches方法,符合条件返回true

    public class MyCondition  implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            String[] properties = (String[])  metadata
                    .getAnnotationAttributes("com.example.demo.condi.MyConditionAnnotation")
                    .get("value");
            for(String property : properties){
                if(StringUtils.isEmpty(context.getEnvironment().getProperty(property))){
                    return false;
                }
            }
            return true;
        }
    }
    

      

    2) 创建注解MyConditionAnnotation ,并且引入Conditional注解,引入MyCondition类

    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Conditional({MyCondition.class})
    public @interface MyConditionAnnotation {
        String[] value() default  {};
    }
    

      

    3) 创建类AA使用注解MyConditionAnnotation 

    @Component
    @MyConditionAnnotation({"com.example.condition1","com.example.condition2"})
    public class AA {
    }
    

      

    4) 测试

    a) 此时并没有com.example.condition1和com.example.condition2这两个属性值,所有测试失败

    b) 然后增加这两个属性。

     测试成功

  • 相关阅读:
    关于git修改和查看用户名邮箱
    Spring深入理解(三)
    Spring深入理解(二)
    Spring深入理解(一)
    jeecg开源快速开发
    关于面向对象的三大特性和五大基本原则
    关于Excel导入导出POI工具类
    关于Hanoi算法
    LOJ 530 最小倍数(数论)
    BZOJ 4242 水壶(BFS建图+最小生成树+树上倍增)
  • 原文地址:https://www.cnblogs.com/linlf03/p/12438854.html
Copyright © 2011-2022 走看看