Spring4有条件

Spring 4引入了一个称为Conditional的新功能,该功能针对于生成bean的Spring组件,并注视这些bean的生成,实质上,它提供了一种条件生成bean的方法。

考虑一个简单的例子:

我有一个名为“ CustomerService”的服务,该服务有两个实现,例如“ CustomerService1”和“ CustomerService2”。 基于系统属性(例如“ servicedefault”)的存在,我要创建默认的“ CustomerService1”实现,如果不存在,则要创建“ CustomerService2”的实例。

使用基于Java配置的Spring bean定义,我可以这样做:

@Configuration
public static class ContextConfig {@Beanpublic CustomerService customerService() {if (System.getProperty("servicedefault")!=null) {return new CustomerServiceImpl1();}return new CustomerServiceImpl2();}
}

另一种方法是使用Spring 3.1引入的Spring Bean Profiles :

@Bean
@Profile("default")
public CustomerService service1() {return new CustomerServiceImpl1();
}@Bean
@Profile("prod")
public CustomerService service2() {return new CustomerServiceImpl2();
}

但是,此特定实例中的Profiles有点笨拙,因为很难设置用于管理一个bean的实现策略的配置文件,它更适合需要控制一组bean的行为的情况。

Spring 4引入了条件注释,可以用一些可重用的方式来实现此行为。

条件依赖于一组条件类来指定谓词,这种方式是:

class HardCodedSystemPropertyPresentCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return (System.getProperty("servicedefault") != null);}
}class HardCodedSystemPropertyAbsentCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return (System.getProperty("servicedefault") == null);}
}

我需要两个谓词,一个用于指定肯定条件,一个用于指定否定条件,这些谓词现在可以应用于bean定义:

@Bean
@Conditional(HardCodedSystemPropertyPresentCondition.class)
public CustomerService service1() {return new CustomerServiceImpl1();
}@Bean
@Conditional(HardCodedSystemPropertyAbsentCondition.class)
public CustomerService service2() {return new CustomerServiceImpl2();
}

但是,请注意,条件代码中有一个硬编码的系统属性名称“ servicedefault”,可以使用元注释进一步清除它。 可以通过以下方式定义新的元注释:

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Conditional(OnSystemPropertyCondition.class)
public @interface ConditionalOnSystemProperty {public String value();public boolean exists() default true;
}

此元注释ConditionalOnSystemProperty接受两个用户指定的属性-系统属性名称的“值”和“存在”以检查该属性是否存在或检查该属性不存在。 该元注释使用@Conditional注释进行标记,该注释指向Condition类以触发使用此新的meta注释进行注释的bean,Condition类如下:

public class OnSystemPropertyCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Map<String, Object> attributes = metadata.getAnnotationAttributes(ConditionalOnSystemProperty.class.getName());Boolean systemPropertyExistsCheck = (Boolean)attributes.get("exists");String systemProperty = (String)attributes.get("value");if ((systemPropertyExistsCheck && (System.getProperty(systemProperty) != null)) ||(!systemPropertyExistsCheck && (System.getProperty(systemProperty) == null))) {return true;}return false;}
}

这里的逻辑是使用元注释来掌握@Bean实例上定义的属性,并基于附加的“ exists”属性触发检查系统属性是否存在。 现在,可以在@Bean实例上定义此可重用的元注释,以通过以下方式有条件地创建bean:

@Configuration
public static class ContextConfig {@Bean@ConditionalOnSystemProperty("servicedefault")public CustomerService service1() {return new CustomerServiceImpl1();}@Bean@ConditionalOnSystemProperty(value="servicedefault", exists=false)public CustomerService service2() {return new CustomerServiceImpl2();}
}

包起来

这里的示例很简单,可能不是很现实,仅用于演示条件功能。 在Spring 4中,一个更好的例子是使用条件修改我之前提到的基于Spring 3.1的Profiles本身的行为的方式,
现在, Profiles在内部基于基于条件的元注释:

@Conditional(ProfileCondition.class)
public @interface Profile {String[] value();
}

参考: Spring4有条件,来自我们的JCG合作伙伴 Biju Kunjummen,在all和其他博客上。

翻译自: https://www.javacodegeeks.com/2013/10/spring-4-conditional.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

inline「一」:从 image 底部白边初识 line-height

本文首发于个人博客 http://www.lijundong.com/image-and-line-height/ 今天在做一个静态页面时&#xff0c;图片底部出现一条 3px 高度的白边&#xff0c;既不是 margin 也不是 padding&#xff0c;找了好久没能解决&#xff0c;后来才发现与 line-height 相关&#xff0c;问…

(转) STM32--ADC

原标题&#xff1a;STM32之ADC步骤小技巧&#xff08;英文&#xff09; 看到标题&#xff0c;别吓到哈、并不是要用英文写、至于原因是什么、请往下看&#xff1a; 言归正传&#xff1a;STM32的ADC模块的特色 1、1MHz转换速率、12位转换结果&#xff08;12位、记住这个12位哈、…

java resultset 映射到实例_[Java]ResultSet的用法与实例

JDBC API 2.0/3.0中ResultSet记录集的简便实用的新特性1 新定义了若干个常数这些常数用于指定ResultSet 的类型游标移动的方向等性质&#xff0c;如下所示&#xff1a;public static final int FETCH_FORWARD; 该常数的作用是指定处理记录集中行的顺序&#xff0c;是由前到后即…

嗨,那里有回调!

因为是我的书包&#xff0c;所以我喜欢JavaScript 。 实际上&#xff0c;我已经开始喜欢JavaScritp的面向异步回调的编程风格 。 因此&#xff0c;当我发现自己处于非JavaScript环境中时&#xff08;例如Java&#xff09; &#xff0c;我往往会错过使用回调的机会。 好消息是…

python2.x 文件读写

打开文件 f open(filename,type) # filename 是文件所在路径# type 为文件打开的方式&#xff0c;也是字符串 读取单行 oneLineStr f.readline() 读取所有&#xff0c;一行一行读取 allInLines f.readlines() 读取所有&#xff0c;返回一个字符串 all f.read() 去除字符串开…

synchronized 修饰在 static方法和非static方法的区别

Java中synchronized用在静态方法和非静态方法上面的区别 在Java中&#xff0c;synchronized是用来表示同步的&#xff0c;我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么&#xff0c;在static方法和非static方法前面加synchronized到…

Flexible 弹性盒子模型之CSS justify-content 属性

实例 在弹性盒对象的 <div> 元素中的各项周围留有空白&#xff1a; div{display: flex;justify-content: space-around;} 复制 效果预览 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号。 紧跟在 -webkit-, -ms- 或 -moz- 后的数字为支持该前缀属性的第一…

java标识符可以$开头吗_JAVA标识符

JAVA标识符JAVA标识符简介Java语言中&#xff0c;对于变量&#xff0c;常量&#xff0c;函数&#xff0c;语句块也有名字&#xff0c;我们统统称之为Java标识符。也就是程序员在定义java程序时&#xff0c;自定义的一些名字&#xff0c;例如helloworld 程序里关键字class后跟的…

GC内存可视化器教程–第一部分

正如您从以前的文章中可能已经读到的那样&#xff0c;要获得的Java程序员的一项关键技能就是理解和评估JVM的运行状况的能力&#xff0c;例如Java堆内存占用量以及垃圾回收过程。 为了实现上述目标&#xff0c;所有JVM供应商&#xff08;Oracle&#xff0c;IBM等&#xff09;都…

设置表格边框颜色

1、源码如下&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>设置表格边框颜色</title><meta http-equiv"keywords" content"keyword1,keyword2,keyword3"…

图片热点

图片热点&#xff1a; 规划出图片上的一个区域&#xff0c;可以做出超链接&#xff0c;直接点击图片区域就可以完成跳转的效果 网页划区&#xff1a; 在一个网页里&#xff0c;规划出一个区域用来展示另一个网页的内容。 网页的拼接&#xff1a; 在一个网络页面内&#xff0c;规…

java se程序设计_JavaSE--Java 的基本程序设计结构

Java 对大小写敏感Java 中定义类名的规则很宽松。名字必须以字母开头&#xff0c;后面可以跟字母和数字的任意组合。长度基本上没有限制。但是不能使用 Java 保留字作为类名。标准的命名规范为&#xff1a;类名是以大写字母开头的名词。如果名字由多个单词组成&#xff0c;每个…

Python开发【第十九篇】:Python操作MySQL

本篇对于Python操作MySQL主要使用两种方式&#xff1a; 原生模块 pymsqlORM框架 SQLAchemypymsql pymsql是Python中操作MySQL的模块&#xff0c;其使用方法和MySQLdb几乎相同。 下载安装 1pip3 install pymysql使用操作 1、执行SQL 123456789101112131415161718192021222324252…

Javaone 2013评论

tl; dr我今年再次参加了Javaone。 好玩。 星期日 会议于周日开幕&#xff0c;进行了用户组会议和主要主题演讲。 实际上&#xff0c;由于我正在运行有关Java SE 7和8中新功能的Java大学培训课程&#xff0c;所以我实际上无法参加这些课程。该课程涵盖了Java 7的项目硬币&#…

20180705 考试记录

T1 货物运输弱化版 题解&#xff1a; 倒着跑最短路就行没仔细看题凉凉 code: #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define F(i,a,b) for(register int i(a);i<(b);i) using namespace std;int rd() {int x…

mysql集群跨地域同步部署_跨地域冗余 - 跨数据中心部署方案 - 《TiDB v2.1 用户文档》 - 书栈网 · BookStack...

跨数据中心部署方案作为 NewSQL 数据库&#xff0c;TiDB 兼顾了传统关系型数据库的优秀特性以及 NoSQL 数据库可扩展性&#xff0c;以及跨数据中心(下文简称“中心”)场景下的高可用。本文档旨在介绍跨数据中心部署的不同解决方案。三中心部署方案TiDB, TiKV, PD 分别分布在 3 …

Flexible 弹性盒子模型之CSS align-items 属性

实例 居中对齐弹性盒的各项 <div> 元素&#xff1a; div{display: flex;align-items:center;} 复制 效果预览 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号。 紧跟在 -webkit-, -ms- 或 -moz- 后的数字为支持该前缀属性的第一个版本。 属性 align-i…

使用Maven进行硒测试自动化

今天&#xff0c;我想帮助您更好地管理自动GUI测试&#xff08;Selenium&#xff09;。 在过去&#xff0c;我已经看到人们处理此问题的许多不同方式。 有些人只是使用Selenium-IDE编写这些普通HTML TestCases&#xff0c;将其存储在HDD上的某个位置&#xff0c;并在需要时手动…

js小练习题

1.2018年01月5日 11:40:30 星期三 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>Title</title>6 <script>7 8 function getCurrentDate(){9 //1. …

OC之OBJC2_UNAVAILABLE

OC之OBJC2_UNAVAILABLE】 1、What is OBJC2_UNAVAILABLE macro mean&#xff1f; 意即在OBJC2.0中&#xff0c;这些东西将被删除。 转自 https://www.cnblogs.com/tekkaman/archive/2013/04/24/3040727.html转载于:https://www.cnblogs.com/-WML-/p/9269067.html