Spring 注解开发之 @Conditional
时间:2022-07-22
本文章向大家介绍Spring 注解开发之 @Conditional,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
这次介绍一下 Spring
中的一个重要的注解 @Conditional
。
本文的组织结构如下:
- 先看一下该注解的作用是什么;
- 再总览这些注解有哪些属性值;
- 最后讲解一下重要的属性值。
Spring 版本 5.1.2.RELEASE
一、注解的作用
在 SpringBoot
中经常看到该注解及其衍生注解,它的作用是根据条件注入组件。
这里我们先创建出两个 Bean
作为例子:
@Bean("bill")
@Conditional({WindowsCondition.class})
public Person person2() {
return new Person("比尔盖茨", 60);
}
@Bean("linus")
@Conditional({LinuxCondition.class})
public Person person3() {
return new Person("李纳斯", 50);
}
这段代码的意思是:如果当前操作系统是 Windows 就将 比尔盖茨 放入容器中,如果是 Linux 就将 李纳斯 放入容器中。
ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2.class);
String[] names = context.getBeanNamesForType(Person.class);
for (String name : names) {
System.out.println(name);
}
// 获取当前的环境: Windows 10
String os = context.getEnvironment().getProperty("os.name");
System.out.println(os);
经过测试得到这里的环境是 Windows 10 。
二、属性总览
该注解只有一个属性。
Class<? extends Condition>[] value();
需要一个 Condition
的子类,所以我们需要自己实现一个子类。
这里我创建了两个子类分别是:
-
WindowsCondition
:判断是不是 Windows 操作系统; -
LinuxCondition
:判断是不是 Linux 操作系统;
三、重要属性讲解
来看一下具体的实现类,以 WindowsCondition
为例:
public class WindowsCondition implements Condition {
/**
* 判断是否符合
*
* @param context 判断条件可以使用的上下文环境
* @param metadata 注释信息
* @return
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 获取 IOC 使用的 beanFactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
// 获取到 Bean 的注册类
BeanDefinitionRegistry registry = context.getRegistry();
boolean cont = registry.containsBeanDefinition("person");
// 获取当前的环境信息
Environment environment = context.getEnvironment();
String property = environment.getProperty("os.name");
// 如果是 win 系统就返回 true
return property != null && property.contains("Windows");
}
}
需要实现一个 match
方法。
这里通过操作系统判断了是不是满足条件,还可以通过 Bean
的注册类设置更多的条件,比如这里的 registry.containsBeanDefinition("person");
判断是否容器中存在 person 这个 Bean
。
LinuxCondition
的实现如下:
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String name = context.getEnvironment().getProperty("os.name");
return name != null && name.contains("linux");
}
}
这样经过测试容器中就只有比尔盖茨:
- 《Node.js在CLI下的工程化体系实践》成都OSC源创会分享总结
- 5分钟教你玩转 sklearn 机器学习(上)
- WebSocket系列之socket.io
- Python 数据分析学习笔记
- ERP管理软件系统设计方案
- 腾讯云GAME-TECH沙龙——全球同服游戏语音解决方案
- 【Scikit-Learn 中文文档】双聚类 - 无监督学习 - 用户指南 | ApacheCN
- ASP.NET MVC的客户端验证:jQuery的验证
- RxJava系列一
- ASP.NET MVC涉及到的5个同步与异步,你是否傻傻分不清楚?[上篇]
- 被遗忘的软件产品形态
- 区块链是什么,一文给您讲清楚
- ASP.NET MVC涉及到的5个同步与异步,你是否傻傻分不清楚?[下篇]
- 2017科技颠覆生活哪家强?
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释