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) 然后增加这两个属性。

     测试成功

  • 相关阅读:
    弄明白python reduce 函数
    Linux 下载百度网盘大文件
    java 从网上下载文件的几种方式
    Windows下Python2与Python3两个版本共存的方法详解
    python 学习笔记
    Glide实现查看图片和保存图片到手机
    Android Animation 知识点速记备忘思维导图
    You must not call setTag() on a view Glide is targeting when use Glide
    前端数据流哲学
    精读《Optional chaining》
  • 原文地址:https://www.cnblogs.com/linlf03/p/12438854.html
Copyright © 2011-2022 走看看