spring条件注解有哪些_Spring4有条件

spring条件注解有哪些

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

spring条件注解有哪些

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

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

相关文章

settimeout怎么用_怎么实现一个3d翻书效果

本篇主要讨论以下两种翻书动画的实现&#xff1a;第一种是整页翻转的效果&#xff1a;这种整页翻转的效果主要是做rotateY的动画&#xff0c;并结合一些CSS的3d属性实现。第二种折线翻转的效果&#xff0c;如下图所示&#xff1a;主要是通过计算页面翻折过来的位置。这两种原理…

springboot怎么返回404_SpringBoot(二十)_404返回统一异常处理结果

1.修改application.properties文件# 自定义404#出现错误时, 直接抛出异常spring.mvc.throw-exception-if-no-handler-foundtrue#不要为我们工程中的资源文件建立映射spring.resources.add-mappingsfalse2.添加controller增强处理if (e instanceof NoHandlerFoundException) {re…

android 通知垃圾回收,Android中垃圾回收日志信息

原因GC_CONCURRENTfreed 178K, 41% free 3673K/6151K, external 0K/0K, paused 2ms2msGC_EXPLICITfreed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms红颜色标出的部分就是垃圾回收触发的原因。在Android中有五种类型的垃圾回收触发原因。GC_CONCURRENT当堆内存增长…

5个令人震惊的统计数据证明日志不足

事实证明&#xff0c;我们都犯有记录不当行为的罪行。 不相信我们吗&#xff1f; 这些统计数据可能会改变您的想法 当人们提出带有明显答案的问题时&#xff0c;这非常令人不快&#xff0c;因此&#xff0c;我不会坐在这里问您和您的团队是否使用日志文件来监视预生产和生产环…

linearregression_机器学习-TensorFlow建模过程 Linear Regression线性拟合应用

TensorFlow是咱们机器学习领域非常常用的一个组件&#xff0c;它在数据处理&#xff0c;模型建立&#xff0c;模型验证等等关于机器学习方面的领域都有很好的表现&#xff0c;前面的一节我已经简单介绍了一下TensorFlow里面基础的数据结构即&#xff1a;Tensor和Dataset&#x…

yum配置文件 重启后还原_江湖救急 : CentOS7.5 /usr 目录误删, 恢复操作.

一.概述前两天在网上找了个脚本,看着没问题,直接复制粘贴了. 结果有特殊字符,直接换行.执行了 rm -rf /usr 目录. 然后就傻了,各种操作命令找不到, 无法登陆.......万分幸运的是,数据没丢,要是丢了.那我就要命了1.如果可以进入操作系统,并且可以正常操作的话. 依旧会存在隐患.…

html页面调用存储过程,用WebBrowser实现HTML界面的应用

HTML的界面有以下特点&#xff1a;图文混排&#xff0c;格式灵活&#xff0c;可以包含Flash、声音和视频等&#xff0c;实现图文声像的多媒体界面&#xff0c;而且易于建立和维护。另外&#xff0c;HTML的显示环境一般机器上都具备&#xff0c;通常不需要安装额外的软件。当然&…

凡事多找找自己的原因_布袋除尘器灰斗积粉过多、堵灰该咋办?别急,从这8个方面找原因...

灰斗布置在袋室的下部&#xff0c;它除了存放收集下来的粉尘以外&#xff0c;还作为下进气总管使用&#xff0c;当含尘气体进入袋室前先进入灰斗&#xff0c;由于灰斗内容积较大&#xff0c;使得气流速度降低&#xff0c;加之气流方向的改变&#xff0c;使得较粗的尘粒在这里得…

javaone_Javaone 2013评论

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

python怎么改变字体大小_Python-docx 整体修改或者部分修改文字的大小和字体类型...

Python中可以用docx来生成word文档&#xff0c;docx中可以自定义文字的大小和字体等。 其中要整体修改文字的字体大小和字体&#xff0c;可以用以下方法&#xff1a; newfile docx.Document() newfile.styles[Normal].font.name Times New Roman newfile.styles[Normal]._ele…

html输入框点击后去掉默认文字颜色,input的一些默认样式的更改

1.Chrome浏览器下&#xff0c;记住密码之后&#xff0c;输入框为黄色的背景&#xff0c;/*忘记密码后的黄色背景的去除*//*只对非透明的纯色背景有效*/input:-webkit-autofill{-webkit-box-shadow: 0 0 0 1000px white inset !important;}/*适用于背景为透明色的输入框*/input:…

cad设计院常用字体_如何把CAD图纸坐标转换成现场坐标?

使用CAD软件画建筑施工图是很常见的&#xff0c;特别是在施工现场&#xff0c;为了不受现场场地落差的影响&#xff0c;需要使用全站仪&#xff0c;但是使用全站仪需要把CAD图纸转换成CAD坐标&#xff0c;很多人可能并不知道该怎么转换&#xff0c;下面我们就来介绍一下如何把图…

sqlserver select 数值精度_SQL Server读懂语句运行 (二) SET STATISTICS IO ON

对于语句的运行&#xff0c;除了执行计划本身&#xff0c;还有一些其他因素要考虑&#xff0c;例如语句的编译时间、执行时间、做了多少次磁盘读等。这些信息对分析问题很有价值。1 SET STATISTICS TIME ON 2 SET STATISTICS IO ON 3 SET STATISTICS PROFILE ON今天&#xff0c…

.net webservice studio调用方法传参_springboot整合WebService简单版

一.什么是webservice这里给大家分享一下我们的专栏《Java 进阶集中营》&#xff0c;每天都会给大家分享一个最新的java技术内容&#xff0c;有优秀的技术讯息&#xff0c;也欢迎分享在我的专栏里。JAVA 进阶集中营​zhuanlan.zhihu.com二.springboot整合webservice 整合webserv…

如何用html5编写彩色同心圆,HTML5 canvas 同心圆动画

原创。产生的动画效果&#xff1a;* 生成文字渐变颜色随时间的变化。* 使得一组同心圆的取色&#xff0c;随时间而变化1.[图片] open_source.png2.[代码][JavaScript]代码var cnew Array("red","blue","cyan","darkGray","green&…

swiper如何防止冲突_冲突管理:化冲突为机会的8个谈话技巧,从此告别争吵和冷战...

书语人间&#xff1a;每天10分钟&#xff0c;读懂1本好书&#xff0c;点击文章右边的「关注」&#xff0c;一起成长大家好呀~今天&#xff0c;灵遥将继续为你带来《解决冲突的关键技巧&#xff1a;如何增加你的有效社交》一书的共读。上一篇里&#xff0c;我们读到了让聆听和谈…

spss非线性回归分析步骤_SPSS与简单线性回归分析

对数据进行简单线性回归分析常按照以下步骤&#xff1a;1根据研究目的确定因变量和自变量现研究某服装店销售额和客流量的关系&#xff0c;销售额为因变量&#xff0c;客流量为自变量&#xff0c;共计36条数据。2 判断有无异常值判断方法&#xff1a;⑴通过绘制散点图直观观察&…

计算机网络由核心通信,计算机网络系统是由通信子网和什么构成的

计算机网络系统是一个集计算机硬件设备、通信设施、软件系统及数据处理能力为一体的,能够实现资源共享的现代化综合服务系统。计算机网络系统的组成可分为三个部分,即硬件系统,软件系统及网络信息系统。1. 硬件系统硬件系统是计算机网络的基础。硬件系统有计算机、通信设备、连…

jwt私钥和公钥怎么获取_jwt 用rsa公钥私钥进行验证(python发送,java接受)

JWT的主要应用场景身份认证在这种场景下&#xff0c;一旦用户完成了登陆&#xff0c;在接下来的每个请求中包含JWT&#xff0c;可以用来验证用户身份以及对路由&#xff0c;服务和资源的访问权限进行验证。由于它的开销非常小&#xff0c;可以轻松的在不同域名的系统中传递&…

通过OAuth 2.0和Okta构建具有安全的服务器到服务器通信的Spring Boot应用

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 大多数OAuth 2.0指南都围绕用户的上下文&#xff0c;即使用Google&#xff0c;Github…