Spring Boot conditional注解用法详解

网友投稿 499 2022-12-12


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))QCvvreix;

}

@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、自定义Conditionahttp://l 注解

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

测试成功


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java封装数组实现包含、搜索和删除元素操作详解
下一篇:Java封装数组实现在数组中查询元素和修改元素操作示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~