• 深入探索Spring Boot的条件装配与条件注解


    Spring Boot 的条件装配(Conditional装配)是一个强大的功能,它允许你根据特定的条件来决定哪些配置类、beans 或组件应该被加载到Spring应用上下文中。这有助于创建更灵活、更模块化的Spring Boot应用程序。

    在Spring Boot中,条件装配主要通过@Conditional注解及其派生注解(如@ConditionalOnClass@ConditionalOnBean@ConditionalOnProperty等)来实现。

    @Conditional

    @Conditional是条件装配的基础注解。它需要一个实现了Condition接口的类作为参数。Condition接口定义了一个matches方法,该方法返回一个布尔值,用于决定条件是否满足。

    public interface Condition {
    
        boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
    
    }
    

    你可以自定义一个实现了Condition接口的类,并在@Conditional注解中使用它。但是,Spring Boot提供了许多预定义的派生注解,这些注解更易于使用。

    派生注解

    @ConditionalOnClass

    这个注解用于检查指定的类是否在类路径上。如果类路径上存在指定的类,则条件满足。

    @Configuration
    @ConditionalOnClass(DataSource.class)
    public class DatabaseConfig {
        // ...
    }
    
    @ConditionalOnBean

    这个注解用于检查Spring应用上下文中是否存在一个或多个指定的beans。如果至少存在一个这样的bean,则条件满足。

    @Configuration
    @ConditionalOnBean(DataSource.class)
    public class DatabaseConfig {
        // ...
    }
    
    @ConditionalOnMissingClass

    这个注解与@ConditionalOnClass相反,它用于检查指定的类是否不在类路径上。

    @ConditionalOnMissingBean

    这个注解与@ConditionalOnBean相反,它用于检查Spring应用上下文中是否不存在一个或多个指定的beans。

    @ConditionalOnProperty

    这个注解允许你基于指定的属性(通常来自application.propertiesapplication.yml文件)的值来决定是否满足条件。

    @Configuration
    @ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true")
    public class MyFeatureConfig {
        // ...
    }
    

    在这个例子中,只有当my.feature.enabled属性的值为true时,MyFeatureConfig才会被加载。

    @ConditionalOnExpression

    这个注解允许你使用SpEL(Spring Expression Language)表达式来定义条件。

    @ConditionalOnSingleCandidate

    这个注解用于确保指定的bean在Spring应用上下文中只有一个实例,并且存在。如果没有这样的bean或存在多个这样的bean,则条件不满足。

    自定义条件

    如果你需要更复杂的条件逻辑,你可以通过实现Condition接口并创建一个自定义的类来定义它。然后,你可以在@Conditional注解中使用这个类。

    总结

    Spring Boot的条件装配功能允许你根据各种条件来动态地加载或排除配置类和beans。通过使用预定义的派生注解或自定义的Condition实现,你可以创建更灵活、更模块化的Spring Boot应用程序。

  • 相关阅读:
    减治思想——二分查找详细总结
    Neo4j数据库(二)
    6.1 - 6.2 公钥密码学简介
    剑指 Offer 34. 二叉树中和为某一值的路径-dfs法
    python-time时间库
    ThinkPHP5+七牛云文件操作 方法梳理
    :active vs :focus
    【PWN · ret2text | RISC-V异构】[2023 羊城杯]login
    JMETER前置处理器类型
    《Java 多线程实战系列》- 01 基本概念与底层原理
  • 原文地址:https://blog.csdn.net/qq_33851668/article/details/139614465