condition系列注解全面罗列

本文详细介绍了Spring Boot中各种@Conditional注解的使用,如@ConditionalOnProperty、@ConditionalOnClass等,教你如何根据配置项、类存在与否控制bean的实例化。通过实例演示了如何在配置项lele.datasource.enabled为true时加载DataSource bean。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在spring某些场景下,我们希望随着某些配置项/类的存在与否,决定一些bean是否被实例化并加载到spring容器。

@Conditional系列注解,便是这个问题的解决方案。

相关注解罗列

1. @Conditional注解 (spring context包下注解

需要给定一个value参数,value必须继承Condition接口,实现match方法。
举例:声明一个名为datasource的bean,我们希望只有在存在配置项 lele.datasource.enabled并且为true时才加载该bean。

@Configuration
public class BeanConfig {
 
    @Conditional({DataSourceCondition.class})
    @Bean(name = "datasource")
    public DataSource(){
        return DataSource build =  DataSourceBuilder.create()
           .driverClassName("test")
            .url("test")
            .username("test")
            .password("test")
            .build();
    }
 
   
}
public class DataSourceCondition implements Condition {
 
    
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //获取ioc使用的beanFactory
        ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
        ClassLoader classLoader = conditionContext.getClassLoader();
        Environment environment = conditionContext.getEnvironment();
        BeanDefinitionRegistry registry = conditionContext.getRegistry();
         String property = environment.getProperty("lele.datasource.enabled");
        if (property.equals(true)){
            return true;
        }
        return false;
    }
}
2. @ConditionalOnProperty注解 (spring boot包下注解

@ConditionalOnProperty 是springboot基于上述@Conditional注解实现的,他的功能单一但是使用上更加简单。
当存在指定配置项为指定value时,该bean才会被加载。
在 1 中的需求,这里只需要一行注解便可以实现。

@ConditionalOnProperty(name = "lele.datasource.enabled", havingValue = "true")
@Bean(name = "datasource")
    public DataSource(){
        return DataSource build =  DataSourceBuilder.create()
           .driverClassName("test")
            .url("test")
            .username("test")
            .password("test")
            .build();
    }

注解主要参数解释

    // 指定的配置项
	String[] value() default {};

   // 配置项等于这个值,才加载bean
	String havingValue() default "";

	// 如果没有配置项,是否生效/加载bean
	boolean matchIfMissing() default false;
3. @ConditionalOnClass (spring boot包下注解

存在指定的class,才会加载该bean。其他同2
参数: Class<?>[] value() default {};

4. @ConditionalOnBean (spring boot包下注解

存在指定的bean,才会加载该bean。其他同2

注解主要参数解释

 /**
     * 需要作为条件的类的Class对象数组
     */
    Class<?>[] value() default {};
    /**
     * 需要作为条件的类的Name,Class.getName()
     */
    String[] type() default {};
    /**
     *  (用指定注解修饰的bean)条件所需的注解类
     */
    Class<? extends Annotation>[] annotation() default {};
    /**
     * spring容器中bean的名字
     */
    String[] name() default {};
    /**
     * 搜索容器层级,当前容器,父容器
     */
    SearchStrategy search() default SearchStrategy.ALL;
    /**
     * 可能在其泛型参数中包含指定bean类型的其他类
     */
    Class<?>[] parameterizedContainer() default {};

5. @ConditionalOnMissingClass (spring boot包下注解

不存在指定的class,才会加载该bean。其他同2
参数: Class<?>[] value() default {};

6. @ConditionalOnMissingBean (spring boot包下注解

不存在指定的bean,才会加载该bean。其他同2

注解主要参数解释

 /**
     * 需要作为条件的类的Class对象数组
     */
    Class<?>[] value() default {};
    /**
     * 需要作为条件的类的Name,Class.getName()
     */
    String[] type() default {};
     /**
       是否有需要过滤掉的子类
     */
    Class<?>[] ignored() default {};
    /**
       同上,Class.getName()
     */
    String[] ignoredType() default {};
    /**
     *  (用指定注解修饰的bean)条件所需的注解类
     */
    Class<? extends Annotation>[] annotation() default {};
    /**
     * spring容器中bean的名字
     */
    String[] name() default {};
    /**
     * 搜索容器层级,当前容器,父容器
     */
    SearchStrategy search() default SearchStrategy.ALL;
    /**
     * 可能在其泛型参数中包含指定bean类型的其他类
     */
    Class<?>[] parameterizedContainer() default {};

7. @ConditionalOnCloudPlatform (spring boot包下注解

是否配置了SAP/CLOUD_FOUNDRY/HEROKU/KUBERNETES/等云平台 其他同2

8. @ConditionalOnExpression (spring boot包下注解

可通过spring提供的spEL表达式灵活配置 其他同2

9. @ConditionalOnJava (spring boot包下注解

可通过javaVersion限制是否加载该bean 其他同2

注解主要参数解释

// 需要比较的java版本
JavaVersion value();

// 当前实际java版本如何与java比较,EQUAL_OR_NEWER代表更新才加载,OLDER_THAN代表版本更老才加载
Range range() default Range.EQUAL_OR_NEWER;
10. @ConditionalOnNotWebApplication (spring boot包下注解

当前不是web环境才加载 其他同2

11. @ConditionalOnWebApplication (spring boot包下注解

当前是web环境才加载 其他同2

12. @ConditionalOnWarDeployment (spring boot包下注解

当前是war包部署才加载 其他同2

13. @ConditionalOnWarDeployment (spring boot包下注解

当前是war包部署才加载 其他同2

14. @ConditionalOnResource (spring boot包下注解

String[] resources参数指定的静态资源文件存在,才加载 其他同2

15. @ConditionalOnSingleCandidate (spring boot包下注解

指定bean只有拥有唯一“候选bean”时,才加载 参数含义同ConditionalOnBean

### 关于论文中伪代码的写作指南 撰写高质量的伪代码对于学术论文至关重要,它能够清晰表达算法逻辑并帮助读者理解其实现细节。以下是基于已知信息和专业知识整理的内容。 #### 伪代码的基本结构 伪代码通常由以下几个部分组成: 1. **输入与输出定义**:明确描述算法所需的输入数据以及产生的输出结果[^1]。 2. **核心步骤分解**:通过分步的方式展示算法的主要流程,并辅以必要的注释以便解释每一步的目的。 3. **数学公式的引入**:如果适用,在适当位置嵌入数学公式来增强精确性和科学性。 下面给出一个按照上述原则设计的具体例子: ```python Algorithm Example_Algorithm(input_data, parameter_a, parameter_b) Input: input_data - 数据集; parameter_a, parameter_b - 控制参数 Output: result_set - 处理后的集合 Initialize empty list as result_set [] For each element e in input_data do: If condition(e, parameter_a) holds then: Transform e using function f(parameter_b) and append to result_set Else: Directly add e into result_set without transformation Return sorted(result_set) Where, condition(x,y): Boolean expression checking properties of x against threshold y. f(z): Mathematical operation defined by z applied on elements. Time Complexity O(n log n), Space Complexity O(n). ``` 此示例展示了如何构建一段简洁明了又不失严谨性的伪代码,其中包含了典型的初始化过程、循环判断语句以及最终返回操作;同时还标注出了时间和空间复杂度作为补充说明材料。 #### 表格形式呈现辅助信息 为了进一步提升可读性,还可以采用表格的形式罗列一些重要特性或者对比不同方法之间的差异点如下表所示: | 属性名称 | 描述 | |----------------|----------------------------------------------------------------------| | 输入类型 | 数组或其他序列化对象 | | 输出格式 | 经过筛选排序的新数组 | | 主要功能模块 | 条件检测函数`condition`, 转换器`f` | | 性能指标(时间)| 平均情况下为O(nlogn),最坏情况取决于内部实现 | | 存储需求(空间)| 额外占用线性级别的内存 | 以上内容不仅有助于直观了解整个方案的工作原理及其效率表现等方面的信息,同时也符合标准化文档的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值