Spring Boot conditional注解用法详解

 更新时间:2020年03月10日 11:55:22   作者:work hard work smart  
这篇文章主要介绍了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) 然后增加这两个属性。

测试成功

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 一文教你掌握Java如何实现判空

    一文教你掌握Java如何实现判空

    实际项目中我们会有很多地方需要判空校验,如果不做判空校验则可能产生NullPointerException异常。所以本文小编为大家整理了Java中几个常见的判空方法,希望对大家有所帮助
    2023-04-04
  • 基于Java反射技术实现简单IOC容器

    基于Java反射技术实现简单IOC容器

    这篇文章主要介绍了基于Java反射技术实现简单IOC容器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • ehcache开源缓存框架_动力节点Java学院整理

    ehcache开源缓存框架_动力节点Java学院整理

    Ehcache是现在最流行的纯Java开源缓存框架,这篇文章主要介绍了ehcache框架的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Java中JSON处理工具类使用详解

    Java中JSON处理工具类使用详解

    这篇文章主要为大家详细介绍了Java中JSON处理工具类的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • JAVA中阻止类的继承(官方和非官方)

    JAVA中阻止类的继承(官方和非官方)

    在面向对象的理论中, 有一些方案要求你用一个办法来声明一个不可继承的类。一般而言,如果类提供的功能不应该被改变,或者更恰当的说,是被覆盖(override)的时候才会出现这种情况。在这篇文章里,我讨论在JAVA语言中的实现办法--官方和非官方的办法
    2014-01-01
  • 解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration

    解决Spring运行时报错:Consider defining a bean o

    该文章主要讲述了在使用Spring框架时,如果遇到某个bean未找到的错误,应该在配置文件中定义该bean,解决方法是在对应的类上添加@Component注解
    2025-01-01
  • Java中的Object.getClass()方法解析

    Java中的Object.getClass()方法解析

    这篇文章主要介绍了Java中的Object.getClass()方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot增强Controller方法@ControllerAdvice注解的使用详解

    SpringBoot增强Controller方法@ControllerAdvice注解的使用详解

    这篇文章主要介绍了SpringBoot增强Controller方法@ControllerAdvice注解的使用详解,@ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller进行增强处理,需要的朋友可以参考下
    2023-10-10
  • Java设计模式之java装饰者模式详解

    Java设计模式之java装饰者模式详解

    这篇文章主要为大家详细介绍了java设计模式之装饰者模式,装饰者模式是一种结构式模式,感兴趣的朋友可以参考一下,希望能够给你带来帮助
    2021-09-09
  • java对ArrayList排序代码示例

    java对ArrayList排序代码示例

    本文通过代码示例给大家介绍java对arraylist排序,代码简洁易懂,感兴趣的朋友一起学习吧
    2015-11-11

最新评论