spring@Conditional
时间:2022-07-25
本文章向大家介绍spring@Conditional,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
@Conditional是什么?可以干什么?
@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。
类图
源码学习
codition是通过判断条件若成立则注册bean否则不注册
public interface Condition {
/**
* 条件判断 true为匹配,false为不匹配
*/
boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
实现源码
版本
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
/**
* @Auther: csh
* @Date: 2020/7/10 17:07
* @Description:条件用户7
*/
public class ConditionUser7 implements Serializable {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ConditionUser7() {
}
public ConditionUser7(String name) {
this.name = name;
}
}
/**
* @Auther: csh
* @Date: 2020/7/10 17:28
* @Description:
*/
@Component
public class SystemCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String env_system = environment.getProperty("env_system");
System.out.println("获取系统变量:"+env_system);
if(env_system.equalsIgnoreCase("windows")){
return true;
}
return false;
}
}
/**
* @Auther: csh
* @Date: 2020/7/10 17:27
* @Description:
*/
@Configuration
public class ConfigSystem {
@Conditional({SystemCondition.class})
@Bean(name = "conditionUser7")
public ConditionUser7 getSystemInfo(){
return new ConditionUser7("hong2");
}
}
/**
* @Auther: csh
* @Date: 2020/7/10 17:38
* @Description:测试@Conditional
*/
public class ConditionalTest {
public static void main(String[] args) {
//从类路径的xm文件载入上下文定义的信息
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConfigSystem.class);
String env_system = context.getEnvironment().getProperty("env_system");
System.out.println("系统为:"+env_system);
Map <String, ConditionUser7> beansOfType = context.getBeansOfType(ConditionUser7.class);
System.out.println(JSONObject.toJSONString((beansOfType)));
}
}
环境变量:
-Denv_system=windows
结果
获取系统变量:windows
系统为:windows
{"conditionUser7":{"name":"hong2"}}
当环境改成
-Denv_system=linux
结果
获取系统变量:linux
系统为:linux
{}
执行顺序
1.是在执行AnnotationConfigApplicationContext#reflsh方法,调用invokeBeanFactoryPostProcessors,执行 BeanFactoryPostProcessorr的postProcessBeanDefinitionRegistry 方法
2.会加载bean的定义信息
3.会执行ConditionEvaluator#shouldSkip判断这个类是否应该被跳过
然后就会调用我们自定义的ColorCondition#matches方法
如果返回false,则不会注册对应bean到ioc容器中
代码下载:https://gitee.com/hong99/spring/issues/I1N1DF
最后
@condition这个注释非常好理解也就是条件的意思,当然本版本是4.x的如果是5.x以后可能稍有不一样,不过大致相同,该注解其实就是通过一些条件来判断是否注入到bean中,的确是一个非常不错的注解,在一些业务场景下或加载某些配置。更多请查看源码,谢谢。
- 基于开源项目搭建属于自己的技术堆栈
- Redis整合Spring项目搭建实例
- SpringMVC+Hibernate +MySql+ EasyUI实现POI导出Excel(二)
- Nginx+Tomcat+Redis负载均衡Session共享实现超级简单(CentOS6.9系统 Java版本)
- Apache Ignite——新一代数据库缓存系统
- 微信JSSDK接入Java版--步骤及问题处理和解决
- 微信企业号回调模式配置讲解 Java Servlet+Struts2版本 echostr校验失败解决
- Android Material Design系列之RecyclerView和CardView
- 在Linux安装ASP.Net Core的运行时(Runtime)
- 使用xUnit为.net core程序进行单元测试(下1)
- Otto开发初探——微服务依赖管理新利器
- Apache Eagle——eBay开源分布式实时Hadoop数据安全方案
- Spring/Hibernate 应用性能优化的7种方法
- 浅谈应用型机器学习作为一种搜索问题
- 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 文档注释
- 代码审计-.NET下的序列化与反序列化(BinaryFormatter)
- 02.视频播放器整体结构
- Spring中@Component和@Bean
- HTTP对接方式
- 使用ShardingSphere 过程中遇到的关于spring boot 版本的问题
- 腾讯云TKE-Pod案例: 容器内crontab问题
- iOS音视频接入 - TRTC多人视频会议
- Spring系列 SpringMVC的请求与数据响应
- codeforces 1349A(数学)
- leetcode之找不同
- 太强了,这居然是19年双非本科开发一年的Android面筋!开发几年的老程序员自叹不如
- Kotlin Vocabulary | Reified: 类型擦除后再生计划
- WorkManager 在 Kotlin 中的实践
- ElasticSearch 集群分片内部原理
- 360webscan防注入脚本全面绕过