1.@ConditionalOnBean

@Configuration
public class MyConfiguration {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean
    @ConditionalOnBean(MyBean.class)
    public AnotherBean anotherBean() {
        return new AnotherBean();
    }
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • myBean() 方法定义了一个类型为 MyBean 的 bean。
  • anotherBean() 方法使用了 @ConditionalOnBean(MyBean.class) 注解,这意味着它定义的 bean (AnotherBean) 只有在上下文中存在 MyBean 类型的 bean 时才会被创建。

如果 MyBean 不存在,anotherBean() 就不会被创建。这是一种根据上下文中是否存在特定 bean 有条件地配置应用程序的方法。

2.@ConditionalOnClass

@Configuration
@ConditionalOnClass(name = "org.springframework.web.servlet.DispatcherServlet")
public class MyConfiguration {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnClass(name = “org.springframework.web.servlet.DispatcherServlet”) 表示只有当类路径中存在名为 org.springframework.web.servlet.DispatcherServlet 的类时,该配置才会生效。
  • 如果指定的类不存在于类路径中,那么配置类中定义的 bean (MyBean) 将不会被创建。

3.@ConditionalOnExpression

SpEL表达式

  1. 访问属性和方法:
    • 通过使用点号 . 来访问对象的属性和调用方法。例如,person.name 表示访问 person 对象的 name 属性。
  2. 索引和集合:
    • 使用 [] 来访问数组和集合。例如,myArray[0] 表示访问数组的第一个元素。
  3. 运算符:
    • SpEL 支持各种运算符,包括算术运算符、逻辑运算符、比较运算符等。
  4. 条件运算符:
    • SpEL 支持三元条件运算符,例如,condition ? trueValue : falseValue
  5. 正则表达式匹配:
    • SpEL 提供了 matches 运算符,可以用于正则表达式匹配。
  6. 类型:
    • SpEL 具有类型转换的功能,你可以在表达式中进行类型转换,例如,(int) ‘42’ 表示将字符串转换为整数。
  7. 集合选择和投影:
    • SpEL 支持在集合上进行选择和投影操作。例如,users.?[age > 21] 表示选择年龄大于 21 的用户。
  8. 注入 Bean:
    • 在 Spring 中,可以使用 @Value 注解和 SpEL 表达式来注入 bean 的属性。例如,@Value(“#{myBean.property}”)
  9. 使用环境变量:
    • SpEL 允许使用 #{systemProperties[‘property.name’]}#{systemEnvironment[‘env.variable’]} 的方式来引用系统属性或环境变量。
  10. 在注解中使用:
  • SpEL 可以在注解中使用,例如,在 @ConditionalOnExpression@Value 等注解中。
myapp.feature.enabled=true

@Configuration
@ConditionalOnExpression("${myapp.feature.enabled:true}")
public class MyConfiguration {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

4.@ConditionalOnJava

@Configuration
@ConditionalOnJava(range = ConditionalOnJava.Range.EQUAL_OR_NEWER, value = JavaVersion.EIGHT)
public class MyConfiguration {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnJava(range = ConditionalOnJava.Range.EQUAL_OR_NEWER, value = JavaVersion.EIGHT) 表示只有当运行应用程序的 JVM 版本等于或新于 Java 8 时,该配置才会生效。
  • 如果 JVM 版本不满足条件,配置类中定义的 bean (MyBean) 将不会被创建。

5.@ConditionalOnJndi

@Configuration
@ConditionalOnJndi("java:comp/env/jdbc/myDataSource")
public class MyConfiguration {

    @Bean
    public MyDataSource myDataSource() {
        // Configuration for the DataSource
        return new MyDataSource();
    }
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnJndi(“java:comp/env/jdbc/myDataSource”) 表示只有当 JNDI 中存在名为 java:comp/env/jdbc/myDataSource 的条目时,该配置才会生效。
  • 如果 JNDI 条目不存在,配置类中定义的 bean (MyDataSource) 将不会被创建。

6.@ConditionalOnMissingBean

@Configuration
public class MyConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public MyBean myBean() {
        return new MyBean();
    }
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @Bean 方法上使用了 @ConditionalOnMissingBean 注解,表示只有当类型为 MyBean 的 bean 不存在于 Spring 上下文中时,才会创建该 bean。
  • 如果已经有一个类型为 MyBean 的 bean 存在于上下文中,那么该方法不会执行,避免了重复创建相同类型的 bean。

7.@ConditionalOnMissingClass

@Configuration
@ConditionalOnMissingClass("com.example.ExampleClass")
public class MyConfiguration {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnMissingClass(“com.example.ExampleClass”) 表示只有当类路径上不存在名为 com.example.ExampleClass 的类时,该配置才会生效。
  • 如果指定的类存在于类路径上,配置类中定义的 bean (MyBean) 将不会被创建。

8.@ConditionalOnNotWebApplication

@Configuration
@ConditionalOnNotWebApplication
public class MyConfiguration {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnNotWebApplication 表示只有当应用程序不是Web应用程序时,该配置才会生效。
  • 如果应用程序是Web应用程序,配置类中定义的 bean (MyBean) 将不会被创建。

9.@ConditionalOnProperty

@Configuration
@ConditionalOnProperty(name = "myapp.feature.enabled", havingValue = "true")
public class MyConfiguration {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnProperty(name = “myapp.feature.enabled”, havingValue = “true”) 表示只有当配置属性 myapp.feature.enabled 的值为 “true” 时,该配置才会生效。
  • 如果配置属性不存在或者值不是 “true”,配置类中定义的 bean (MyBean) 将不会被创建。

你可以使用 name 指定配置属性的名称,havingValue 指定期望的属性值,还可以通过 matchIfMissing 指定当配置属性不存在时是否匹配,默认值为 false

10.@ConditionalOnResource

@Configuration
@ConditionalOnResource(resources = "myconfig.properties")
public class MyConfiguration {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnResource(resources = “myconfig.properties”) 表示只有当类路径上存在名为 myconfig.properties 的资源文件时,该配置才会生效。
  • 如果指定的资源文件不存在,配置类中定义的 bean (MyBean) 将不会被创建。

11.@ConditionalOnSingleCandidate

@Configuration
public class MyConfiguration {

    @Bean
    @ConditionalOnSingleCandidate(MyService.class)
    public MyBean myBean(MyService myService) {
        return new MyBean(myService);
    }
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @Bean 方法上使用了 @ConditionalOnSingleCandidate(MyService.class) 注解,表示只有当类型为 MyService 的 bean 在 Spring 上下文中有且只有一个候选者时,才会创建该 bean。
  • 如果有多个或者一个都没有符合条件的 MyService 类型的 bean,那么配置类中定义的 bean (MyBean) 将不会被创建。

12.@ConditionalOnWebApplication

@Configuration
@ConditionalOnWebApplication
public class MyWebConfiguration {

    @Bean
    public MyWebBean myWebBean() {
        return new MyWebBean();
    }
}

在这个例子中:

  • MyWebConfiguration 是一个配置类。
  • @ConditionalOnWebApplication 表示只有当应用程序是 Web 应用程序时,该配置才会生效。
  • 如果应用程序不是 Web 应用程序,配置类中定义的 bean (MyWebBean) 将不会被创建。
01-26 08:55