联博开奖_Spring Boot 2 实战:使用 @Condition 注解来凭据条件注入 Bean
发表时间:2021-12-19 浏览量:84
Spring Boot 2 实战:使用 @Condition 注解来凭据条件注入 Bean
1. 前言
我们经常会有凭据条件来加载差别的接口。好比你查询目录下文件列表, Windows 下你会用 CMD
的 dir
下令,而 Linux 下你会使用 ls
下令。 熟悉 Spring Boot 自动设置的也知道 Spring Boot 能凭据差别的实际情况启用差别的设置。这就是@Conditional
注解在发挥作用。 该注解指定了在什么条件下建立 Bean 举行设置。
2. @Conditional 注解
Spring Boot 包罗多个 @Conditional
注释,可以在@Configuration
注解的类和@Bean
注解方式中使用。@Conditional
类型的注解,可以注解在类上,可以注解在Bean
方式上,可以允许基于Spring Environment属性包罗设置,可以仅允许在存在特定资源时包罗设置。也可自界说,接下来我们来熟悉一下 Spring Boot 提供的一些详细的条件注解。
2.1 Class Conditions
@ConditionalOnClass
和@ConditionalOnMissingClass
两个在类上的注解:
判断指定的类是否存在来构建自动设置,也可使用name
属性名来指定类名。
2.2 Bean Conditions
@ConditionalOnBean
和@ConditionalOnMissingBean
两个在 Bean 方式上的注解:
判断指定的 Bean 是否存在来构建自动设置,可以使用value
属性来按类型或名称(id)指定 Bean, 可以使用search
属性指定 ApplicationContext 条理结构来搜索Bean
。
@Configuration
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService() { ... }
}
要添加注重添加 Bean 时的顺序,官方建议在自动设置类上仅使用 @ConditionalOnBean
和@ConditionalOnMissingBean
注释,由于可以保证这些注释在添加用户界说的Bean后执行。
@ConditionalOnBean
和@ConditionalOnMissingBean
注解作用在@Configuration
注释的类上,等同于在作用在每个包罗@Bean
的方式上。
2.3 Property Conditions
@ConditionalOnProperty
注解可以基于Spring Environment属性包罗的设置进判断,再决议自动设置的执行,使用 prefix
和 name
属性指定应检查的属性。默认情况下,匹配存在且不即是false的任何属性。 您还可以使用havingValue
和matchIfMissing
属性建立更高级的检查。
,www.yahongf.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。
2.4 Resource Conditions
@ConditionalOnResource
注释仅允许在存在特定资源时执行自动设置。 可以使用常用的 Spring 约定来指定资源,如以下示例所示:file:/home/user/test.dat。
2.5 Web Application Conditions
@ConditionalOnWebApplication
和@ConditionalOnNotWebApplication
注解用于判断应用程序是否为Web应用程序
,Web应用程序是使用Spring WebApplicationContext,界说会话局限或具有StandardServletEnvironment的任何应用程序。
2.6 SpEL Expression Conditions
@ConditionalOnExpression
注解允许凭据SpEL表达式的效果来执行设置。
3. 自界说 Condition
若是上面几种都不能知足你的需要。那么我们可以通过实现Condition
接口,并重写其matches
方式来组织判断条件。
- 1.实现 Condition 接口来界说判断条件
//Windows系统的判断条件
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("os.name").contains("Windows");
}
}
//Linux系统的判断条件
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("os.name").contains("Linux");
}
}
- 2.实现差别系统下的Bean类
//接口
public interface ListService {
public String showListCmd();
}
//Windows下的实现类
public class WindowsListServiceImpl implements ListService {
@Override
public String showListCmd() {
return "dir";
}
}
//Linux下的实现类
public class LinuxListServiceImpl implements ListService {
@Override
public String showListCmd() {
return "ls";
}
}
- 3.设置类
@Conditional注解挪用条件判断的类并凭据返回的效果来建立Bean
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConditionConfig {
@Bean
@Conditional(WindowsCondition.class)
public ListService windowsListService() {
return new WindowsListServiceImpl();
}
@Bean
@Conditional(LinuxCondition.class)
public ListService linuxListService() {
return new LinuxListServiceImpl();
}
}
- \4. 测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class SecurityLearningApplicationTests {
@Resource
private ListService listService ;
@Resource
private ApplicationContext context;
public void testCondition(){
System.out.println(context.getEnvironment().getProperty("os.name")
+ "系统下的列表下令:"
+ listService.showListCmd());
}
}
4. 总结
今天我们对 Spring Boot 中的 Condition 条件判断注入举行了系统性的领会。不仅对 Spring Boot 提供的一些开箱即用的 Condition 举行了学习,还实现了自界说的 Condition 。若是你要对 Spring Boot 的自动设置深入学习或者凭据营业来天真定制,就必须对 Condition 举行系统性的学习。
0
珍藏