conditional_如何:在Spring中使用@Conditional和Condition注册组件

conditional

Spring中的@Profile批注可用于任何自动检测候选对象的Spring组件(例如, @Service Component, @Service @Component@Service @Configuration等)。 @Profile批注接受单个配置文件或一组必须是活动的配置文件,以使带注释的组件有资格进行自动检测。 对于给定的@Profile({"p1", "!p2"}) ,如果配置文件p1处于活动状态配置文件p2不处于活动状态,则会进行注册。 至关重要。

但是,如何使用@Profile实现此目标:如果配置文件p1处于活动状态并且配置文件p2 p3均处于非活动状态,我们想激活给定的组件吗?

让我们假设以下情况:我们有一个NotificationSender接口,该接口由以下方式实现:

  • SendGridNotificationSender –仅在sendgrid配置文件处于活动状态时才处于活动状态,
  • EmailNotificationSender –仅在email配置文件处于活动状态时才活动。
  • NoOpNotificationSender –仅在development配置文件处于活动状态且sendgridemail没有处于活动状态时才处于活动状态。

另外:一次只能注册一个NotificationSenderdevelopment配置文件可以与sendgridemail配置文件结合使用。

在上述情况下,使用@Profile注释似乎还不够。 也许我使事情变得有些复杂,但实际上我真的很想实现上述目标而没有介绍其他配置文件。 我是怎么做到的?

我使用了Spring的4 @Conditional注释。 当所有指定Condition匹配时, @Conditional允许注册组件:

@Component
@Conditional(value = NoOpNotificationSender.ProfilesCondition.class)
class NoOpNotificationSender extends NotificationSenderAdapter {}

ProfilesCondition实现org.springframework.context.annotation.Condition接口:

public static class ProfilesCondition implements Condition {@Overridepublic boolean matches(ConditionContext c, AnnotatedTypeMetadata m) {}
}

问题的整体解决方案:

@Component
@Conditional(value = NoOpNotificationSender.ProfilesCondition.class)
class NoOpNotificationSender extends NotificationSenderAdapter {static class ProfilesCondition implements Condition {@Overridepublic boolean matches(ConditionContext c, AnnotatedTypeMetadata m) {return accepts(c, Profiles.DEVELOPMENT)&& !accepts(c, Profiles.MAIL)&& !accepts(c, Profiles.SEND_GRID);}private boolean accepts(ConditionContext c, String profile) {return c.getEnvironment().acceptsProfiles(profile);}}
}

当适当的配置文件处于活动状态时,其他组件将被激活:

@Component
@Profile(value = Profiles.SEND_GRID)
public class SendGridNotificationSender extends NotificationSenderAdapter {}@Component
@Profile(value = Profiles.MAIL)
class EmailNotificationSender extends NotificationSenderAdapter {}

用法示例:

活动资​​料
发展 NoOpNotificationSender
开发,sendgrid SendGridNotificationSender
开发,邮件 EmailNotificationSender
sendgrid SendGridNotificationSender
邮件 EmailNotificationSender


你怎么看? 您将如何解决这个问题?

翻译自: https://www.javacodegeeks.com/2015/11/register-components-using-conditional-condition-spring.html

conditional

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

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

相关文章

jquery mysql php_jQuery+PHP+Mysql在线拍照和在线浏览照片

本文示例建立在本站helloweba.net两篇文章之上,一篇是用于在线拍照的:JavascriptPHP实现在线拍照功能,另一篇是用于浏览照片的:Fancybox丰富的弹出层效果。如果您对在线拍照和Fancybox不大了解,可以先参照以上两篇文章…

java 字符串文字筛选_拜托,Java。 最终是否支持多行字符串文字

java 字符串文字筛选我了解Java语言的思想很难以向后兼容的方式进行维护。 我知道JDK API(例如集合)的想法很难打破。 是。 我不明白为什么Java 仍然没有多行字符串文字。 您多久编写一次这样的JDBC代码(或您想要嵌入到Java中的任何其他外部…

设计散列表实现通讯录查找系统_[源码和文档分享]利用哈希表实现电话号码查询系统...

第一章 需求分析1.1 问题描述设计一个电话号码查询系统,为来访的客⼈提供各种信息查询服务。1.2 基本要求设计每个记录有下列数据项:电话号码、用户名、地址从键盘输入个记录,分别以电话号码和用户名为关键字建立不同散列表存储采用一定的方法…

C++基础(1)

【1】简述#include<>和#include" "的区别 答&#xff1a;前者直接从编译器指定的路径处搜索&#xff1b; 后者在程序当前的目录进行搜索&#xff0c;如果没有搜索到再从编译器指定的路径出搜索。 【2】简述##与#在define中的作用 答&#xff1a;1.宏定义中#…

java 存储数据到文件中_本机速度文件支持的“纯” Java大数据存储

java 存储数据到文件中动机 所有这一切始于意识到我买不起足够大的计算机。 音频处理需要大量的内存。 Audacity是一款出色的免费音频处理器&#xff0c;它使用文件支持的存储系统对其进行管理。 这是解决此类问题的常用方法&#xff0c;在这些问题中&#xff0c;我们存储大量信…

mysql每条sql以什么结束_一条 SQL 查询语句是如何执行的?

一条 SQL 查询语句是如何执行的&#xff1f;比如&#xff0c;你有个最简单的表&#xff0c;表里只有一个ID字段&#xff0c;在执行下面这个查询语句时mysql> select from T where ID10;我们只看到一个输入语句&#xff0c;返回一个结果&#xff0c;却不知道这个 SQL 语句在 …

C++基础(2)

【1】静态全局变量 1.通常情况下&#xff0c;静态全局变量的声明和定义放在源文件中&#xff0c;并且不能使用extern关键字将全局静态变量导出&#xff0c;作用域仅限于定义静态全局变量的文件内部。 2.如果头文件中声明静态全局变量&#xff0c;在声明的同时会被初始化&…

ROI区域图像叠加

#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2\opencv.hpp> using namespace cv; using namespace std;int main() {//1.加载两幅图片Mat src imread("风景.jpg"…

drill apache_使用Apache Drill REST API通过Node构建ASCII仪表盘

drill apacheApache Drill有一个隐藏的瑰宝&#xff1a;易于使用的REST接口。 该API可用于查询&#xff0c;分析和配置Drill引擎。 在此博客文章中&#xff0c;我将解释如何使用Brilled Contrib使用Drill REST API创建ascii仪表板。 ASCII仪表盘如下所示&#xff1a; 先决条…

mysql 8.0用doc修改密码_MYSQL8.0修改密码流程

MYSQL8.0修改密码流程1.以管理员身份打开cmd2.找到mysql 的安装路径bin文件的路径&#xff0c;3.输入net start mysql4.输入mysql -u root -p5.找到my.ini文件6.在my.ini里面的[mysqld]这一行后面添加 skip -grant-tables,保存文件&#xff0c;注意不是[mysql]7.输入mysqld --s…

颜色空间缩减color space reduction

颜色空间缩减公式 //---------------------------------【头文件、命名空间包含部分】-------------------------- // 描述&#xff1a;包含程序所使用的头文件和命名空间 //---------------------------------------------------------------------------------------…

运动基元_发现大量Java基元集合处理

运动基元在阅读博客文章5减少Java垃圾收集开销的技巧时 &#xff0c;我想起了一个名为Trove的小型Java收集库&#xff0c;该库“为Java提供了高速的常规和原始收集”。 我对将Trove应用到允许原语的集合而不是要求集合中的元素成为完整的引用对象的能力特别感兴趣。 我在这篇文…

python判断奇偶数字符串的拼接_Python字符串拼接方法总结

这篇文章主要介绍了Python字符串拼接的几种方法整理的相关资料,这里提供了五种方法及实现&#xff0c;需要的朋友可以参考下Python字符串拼接的几种方法整理第一种 通过加号()的形式print(第一种方式通过加号形式连接 &#xff1a; lovePython \n)第二种 通过逗号(,)的形式pr…

Split分离通道

#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2\opencv.hpp> using namespace cv; using namespace std;int main() {vector<Mat>cha;Mat b, g, r,dst;//1.加载两幅图片…

上下文异常中的上下文属性_在没有适当上下文的情况下引发异常是一种不良习惯...

上下文异常中的上下文属性Allison Anders等人的《四个房间》&#xff08;1995&#xff09;。 我不断重复同样的错误。 因此&#xff0c;该停止并制定规则以防止这种情况了。 错误不是致命的&#xff0c;但很烦人。 当查看生产日志时&#xff0c;经常会看到类似"File does…

最大公约数简便算法_求最大公约数的4种算法

for(z0; z<10000000; z) 循环只是为了增加程序的运行时间&#xff0c;让我们体会算法的时间复杂度。算法一&#xff1a;短除法想法&#xff0c;采用短除法找出2个数的所有公约数&#xff0c;将这些公因子相乘&#xff0c;结果就是2个数的最大公约数。【找公因子&#xff0c;…

java 编写代码_如果您在2015年编写过Java代码-这是您不容错过的趋势

java 编写代码去年我们有机会遇到的最有趣趋势的实用概述 在这篇文章中&#xff0c;我们回顾了构成我们2015年对话的5个主题和新发展。与其他许多年终总结保持较高水平的不同&#xff0c;我们将做一个更实际的操作不用流行语 。 好吧&#xff0c;没有太多*流行语。 与往常一样…

java自动生成合同_Java 7和Java 8之间的细微自动关闭合同更改

java自动生成合同Java 7的try-with-resources语句和与该语句一起使用的AutoCloseable类型的一个不错的功能是&#xff0c;静态代码分析工具可以检测到资源泄漏。 例如&#xff0c;Eclipse&#xff1a; 当您具有上述配置并尝试运行以下程序时&#xff0c;您将收到三个警告&…

Python学习(1)

1.str字符串操作 len(str) 计算字符串长度 str.replace(xxx,xxxx) 替换指定字符 str.upper()字符串转大写 str.lower()字符串转小写 str.strip()删除左右多余的空格 str.lstrip()删除左边多余的空格 str.rstrip()删除右边的空格 format(a,b,c) 传参显示 2.索引 out hello wo…

opencv求两张图像光流_光流(optical flow)和openCV中实现

转载请注明出处&#xff01;&#xff01;&#xff01;光流(optical flow)和openCV中实现光流的概念&#xff1a;是Gibson在1950年首先提出来的。它是空间运动物体在观察成像平面上的像素运动的瞬时速度。是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一…