Spring Enable批注–编写自定义的Enable批注

Spring提供了一系列名称以Enable *开头的注释,这些注释本质上使某些Spring管理的功能可以被激活。 这样的注释的一个很好的例子是EnableWebMvc ,它引入了在基于Spring的应用程序中支持MVC流所需的所有bean。 另一个很好的例子是EnableAsync注释,用于在基于Spring的应用程序中激活bean以支持异步功能。

我对这样的注释如何工作感到好奇,并希望记录下我的理解。 支持这些注释的方式可以视为SPI的一部分,因此,如果将来内部实现发生更改,则可能会中断。

简单的启用*注释

考虑这些自定义注释的一种方法是,它们将一组新bean添加到Spring的应用程序上下文中。 让我们首先定义一个这样的自定义注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface EnableSomeBeans {}

并将此注释应用于Spring @Configuration类:

@Configuration
@EnableSomeBeans
public static class SpringConfig {}

因此,现在在应用此批注时引入一组bean就像添加通过@Import批注以这种方式引入的bean组一样简单:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(SomeBeanConfiguration.class)
@interface EnableSomeBeans {}

本质上就是这样,如果此导入的@Configuration类定义了任何bean,则它们现在将成为Application上下文的一部分:

@Configuration
class SomeBeanConfiguration {@Beanpublic String aBean1() {return "aBean1";}@Beanpublic String aBean2() {return "aBean2";}
}

这是一个具有工作样本的要点 。

使用选择器启用*注释

启用注释可能要复杂得多,它们可以根据周围的上下文来激活不同的Bean系列。 这样的注释的一个示例是EnableCaching ,它基于类路径中可用的不同缓存实现来激活配置。

与之前的简单示例相比,编写此类Enable *注释要花费更多的精力。 与之前一样,从一个自定义注释开始:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(SomeBeanConfigurationSelector.class)
public @interface EnableSomeBeansSelector {String criteria() default "default";
}

请注意,在这种情况下,自定义注释具有一个称为标准的示例字段,我要做的是根据此标准激活两组不同的bean。 这可以通过使用@Configuration选择器来实现,该选择器可以根据上下文返回不同的@Configuration文件(在此示例中,criteria字段的值)。 该选择器具有一个简单的签名,这是一个示例实现:

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata;public class SomeBeanConfigurationSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {AnnotationAttributes attributes =AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes
(EnableSomeBeansSelector.class.getName(), false));String criteria = attributes.getString("criteria");if (criteria.equals("default")) {return new String[]{"enableannot.selector.SomeBeanConfigurationDefault"};}else {return new String[]{"enableannot.selector.SomeBeanConfigurationType1"};}}
}@Configuration
class SomeBeanConfigurationType1 {@Beanpublic String aBean() {return "Type1";}}@Configuration
class SomeBeanConfigurationDefault {@Beanpublic String aBean() {return "Default";}}

因此,如果条件字段为“默认”,则添加“ SomeBeanConfigurationDefault”中的bean,否则添加“ SomeBeanConfigurationType1”中的bean

  • 这是一个具有工作样本的要点 。

结论

我希望这能对Spring如何在内部实现@ Enable *注释有所了解,作为应用程序开发人员,您可能不需要自己创建此类注释,一种更简单的机制是使用@Configuration类和Spring Bean配置文件来组成应用程序。

翻译自: https://www.javacodegeeks.com/2015/04/spring-enable-annotation-writing-a-custom-enable-annotation.html

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

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

相关文章

java hashmap替换key,HashMap 用可变对象作为 key 踩坑

点击上方☝Java编程技术乐园,轻松关注!及时获取有趣有料的技术文章做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!作者:Icharlehttps://icharle.com/hashmapkebianobj.html前言在 Ja…

(转)Eclipse平台技术概述

转载:周金根 http://zhoujg.blog.51cto.com/1281471/516833Eclipse:Eclipse平台技术概述2010-10-19 13:35:00标签:Eclipse 休闲 职场原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明…

php post调用api,PHP(CURL)POST数据调用API简单示例

/***一个完整的POST调用API的过程 百度知道*author: bo.xiao*/$url ‘http://zhidao.chanjet.com/restserver/zhidao’;$data array(‘api_key’>’3qQ2Edm62Vd4bAVCwNoxgn0l’,‘method’>’baidu.zhidao.getQuestionList’,‘call_id’>’1308713190’,‘cid’>…

【重温经典算法之二】快速排序

快速排序的思想与归并排序思想类似,都是采用分治法的思想。将一个数组A[l...r]使用快速排序可以分解为三个主要的步骤: 通过随机算法获得数组A中的一个下标k,将A[k]与A[r]交换。将数组分解成左右两个数组,左边数组的值均小于A[r]&…

用随机数发生器射击自己的脚

这将不是说明随机数生成器毕竟不是那么随机的文章之一。 因此,您中的那些人希望获得有关如何破解老虎机,继续前进的指南,在这里什么也看不到。 相反,它是有关一个不太常见的锁争用问题的帖子,该问题隐藏在Java API的随…

谈谈你对php的收获和不足,我的收获与不足

在我们的生活中,会经历很多不同的事情。有些是如流水般奔流向海;有些是如云烟一般消散;有些是能够像年轮般随时间流逝,一圈一圈留在那里,却始终浮现在于脑海,因为她曾经一次一次叮呤着你--“知不足才能自强…

cocos2dx

http://blog.csdn.net/iamlazybone/article/details/19046377 转载于:https://www.cnblogs.com/sgdkg/p/3548017.html

带有光纤的可扩展,健壮和标准的Java Web服务

这篇博客文章讨论了负载下的基准Web服务性能。 要了解有关Web服务性能理论的更多信息,请阅读利特尔定律,可伸缩性和容错 。 使用阻塞和异步IO对Web服务进行基准测试 Web应用程序(或Web服务)如何在负载下,面对各种故障…

转document.documentElement和document.body的区别

网页中获取滚动条卷去部分的高度&#xff0c;可以通过 document.body.scrollTop 来获取&#xff0c;比如使div跟着滚动条滚动&#xff1a; 转至:http://www.cnblogs.com/ckmouse/archive/2012/01/30/2332070.html <div id"div" style"width:100px;height:100…

php js 图片旋转,jQuery实现可以控制图片旋转角度效果

本文实例讲述了jQuery实现可以控制图片旋转角度效果。分享给大家供大家参考&#xff0c;具体如下&#xff1a;运行效果截图如下&#xff1a;具体代码如下&#xff1a;/p>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">img { margin-top:100px; m…

【ARDUINO】HC-05蓝牙不配对问题

除了刷主从之外&#xff0c;不配对的原因有1&#xff1a;已经配对其他设备&#xff0c;需用ATRMAAD来移除。2、默认为蓝牙由绑定指令设置&#xff0c;需改为任意地址连接模式ATCMODE1 //#define AT 2 #define LED 12 void setup() {pinMode(LED,OUTPUT);//pinMode(AT,OUTPUT);S…

php 选股器,RSI切线突破选股指标(TDX)..

本帖最后由 yinchoo 于 2009-7-25 09:10 编辑1、对于RSI指标的运用请查坛中伟哥、井中月、cqcsshw 、九阳 等高手的贴子&#xff1a;http://www.stockwei.com/viewthread.php?tid36200&highlightRSIhttp://www.stockwei.com/viewthread.php?tid36267&highlightRSIhtt…

中等数学类杂志投稿信箱

《中国数学教育》jcme_g163.com(高中版) 《数学教学》sxjxzzmath.ecnu.edu.cn 《中学数学》hbzxsx126.com&#xff08;高中&#xff09; 《数学通讯(教师版)》shxtxjshyahoo.com.cn 《数学通讯(学生版)》shxtxxuesh163.com 《数学传播》mediamath.sinica.edu.tw 《中学教研&…

卡方检验法+matlab,【T】显著性检验(2)—卡方检验法

该博文已整理到新地址&#xff1a;记数数据统计法在各个研究领域中&#xff0c;有些研究问题只能划分为不同性质的类别&#xff0c;各类别没有量的联系。例如&#xff0c;性别分男女&#xff0c;职业分为公务员、教师、工人、……&#xff0c;教师职称又分为教授、副教授、………

【OAuth】快速入门

一、引言 1、什么是OAuth2.0&#xff1f; OAuth 2.0是一个关于授权的开放网络协议&#xff0c;允许用户授权第三方应用访问其在服务提供商上存储的资源&#xff08;如照片、视频、联系人列表&#xff09;&#xff0c;而无需将用户名和密码提供给第三方应用。OAuth 2.0在第三方应…

脚本解决.NET MVC按钮重复提交问题

见于&#xff1a;Avoiding Duplicate form submission in Asp.net MVC by clicking submit twice 脚本代码&#xff1a; $(document).on(invalid-form.validate, form, function () {var button $(this).find(input[type"submit"]);setTimeout(function () {button.…

== 与 === 介绍与区别

操作符&#xff1a; 要是两个值类型不同&#xff0c;返回false 要是两个值都是number类型&#xff0c;并且数值相同&#xff0c;返回true 要是两个值都是stirng&#xff0c;并且两个值的String内容相同&#xff0c;返回true 要是两个值都是true或者都是false&#xff0c;返回tr…

jert oracle 统计说明,Oracle JET简单入门(一)Oracle JET介绍

Oracle JET (Oracle Javascript Extension Toolkit)是一款 Oracle 的 JavaScript 拓展工具包。简单来说 Oracle JET 是一个一堆好用的前端工具结合体。Oracle JET 文档链接 http://docs.oracle.com/middleware/jet310/jet/developer/toc.htmOracle JET支持 Model-View-ViewMod…

Why you have so few friends?

Why you have so few friends?十个原因告诉你&#xff1a;为什么你的朋友那么少1. You Complain A Lot 你总是抱怨 If you’re constantly complaining about your job, lack of money, or unfair life, people won’t care to spend a lot of time with you. Complaining g…

查看oracle自动优化,使用索引查询更快,优化器为何不能自动识别

本帖最后由 〇〇 于 2015-12-24 12:17 编辑有如下查询&#xff0c;不加hint时&#xff0c;优化器自己选择的执行计划是走全表扫描&#xff0c;花费时间很长&#xff0c;但加hint强制让大表走skip index时间很短&#xff0c;根据传统的理解&#xff0c;引导列上重复出现的值越少…