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