弹簧可配置魔术

Spring框架有几个提供一系列服务的模块,其中许多模块仅可用于托管对象(Spring Bean)。有关这些服务的一些示例是依赖注入,事务管理,AOP服务等。当我们使用时,一切都很好对象即服务,因此由Spring在特定范围内进行管理。 但是有时候我们需要我们的领域对象拥有这些服务。 通常,域对象是使用new关键字创建的,因此默认情况下无法使用spring对其进行管理。

在我的上一篇文章( 如何在Spring 3.x中使用事件 )中,我们有一个名称为Order的域对象。 对于对象之间的解耦,我们使用了事件。 但是,只有受管bean才能在Spring框架中引发事件(可能是您知道并具有此功能的每个框架)。

Spring引入了一个名为Configurable的注释。 在我们的域对象上使用此注释使它们由spring管理。
但是它是如何工作的:出于其目的可配置,需要AspectJ Compiler,您的类需要在编译时或加载时提高字节码,直到可以满足您的要求。

我想带给您一个有关如何在应用程序中配置和使用可配置电源的简单示例。 最好让环境对象使所有系统都可以访问其属性以捕获有关系统的信息。 例如,我们需要知道系统的当前时间,简单的解决方案是使用Calendar.getInstance().getTime()new Date()

但是有一些缺陷,您的代码对于需要测试日期断言的部分将无法进行测试(我将尽快编写一系列后测试和可测试代码)。

另一个问题是当您希望系统使用伪时钟时。 例如,您的客户希望在假期(最后一个非假期日期)使用系统。

因此,为这些需求提供一种机制很有价值。 作为此示例中的一个简单解决方案,我将创建一个环境接口,该接口具有一个方法(getCurrentTime())。 如果我需要系统时间,则代码中的每个地方都将使用此方法。 在我可以愉快地使用此方法之前,必须将环境接口注入到我的对象中。 Spring bean对使用Environment没有任何问题,但是在我们的域对象中,我们必须使用Configurable Annotation。

如果使用Maven,则需要将以下依赖项添加到pom中:

<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.1.1.RELEASE</version><dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.6.8</version>
</dependency>

要使用maven编译应用程序,可以使用以下Aspectj-maven-plugin配置:

<build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>aspectj-maven-plugin</artifactId><version>1.4</version><configuration><showWeaveInfo>true</showWeaveInfo><source>1.6</source><target>1.6</target><Xlint>ignore</Xlint><complianceLevel>1.6</complianceLevel><encoding>UTF-8</encoding><verbose>false</verbose><aspectLibraries><aspectLibrary><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId></aspectLibrary></aspectLibraries></configuration><executions><execution><goals><goal>compile</goal><goal>test-compile</goal></goals></execution></executions><dependencies><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.6.8</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjtools</artifactId><version>1.6.11</version></dependency></dependencies></plugin></plugins></build>

如果使用IDE编译代码,请不要忘记将其编译器更改为AspectJ。 您可以在AspectJrt目录中的本地Maven存储库中找到它。

假设有一个Product类,我们想知道其创建日期以及销售日期。

@Configurable(preConstruction = true)public class Product {private final String name;private final String description;private final Date createDate;private Status status;private Date saleDate;@Autowiredprivate Environment environment;public Product(String name, String description) {this.name = name;this.description = description;this.status = Status.PENDING;this.createDate = environment.getCurrentDate();}public void sell() {this.status = Status.SALE;this.saleDate = environment.getCurrentDate();}public Date getCreateDate() {return createDate;}public Date getSaleDate() {return saleDate;}public static enum Status {PENDING, SALE;}}

产品是一个非常简单的类,我们使用preConstruction = true是因为我们的产品构造需要使用环境。

环境及其实现也非常简单:

public interface Environment {Date getCurrentDate();}public class DefaultEnvironment implements Environment {@Overridepublic Date getCurrentDate() {return new Date();}}public class MockEnvironment implements Environment {private Date date;@Overridepublic Date getCurrentDate() {return this.date;}public void setCurrentDate(Date date){this.date = date;}}

MockEnvironment是在测试包中创建的,因为我们仅在测试中需要此类。 除了使用此类之外,您还可以使用一些模拟库作为Mocktio及其扩展(Springockito)。 但是在此示例中,我们的重点不在它们上。

我们的测试也非常简单:

@ContextConfiguration({"classpath*:context.xml","classpath*:test-context.xml"})public class ProductTest extends AbstractJUnit4SpringContextTests {final Date time = Calendar.getInstance().getTime();@AutowiredEnvironment environment;@Beforepublic void before() {((MockEnvironment) this.environment).setCurrentDate(time);}@Testpublic void created_product_should_have_current_environment_date() {final Product product = new Product("", "");Assert.assertEquals(time, product.getCreateDate());}@Testpublic void sell_should_set_createDate_to_now(){final Product product = new Product("", "");product.sell();Assert.assertEquals(time, product.getSaleDate());}}

您可以从以下网址下载源代码: https : //github.com/psycho-ir/Spring-Configurable.git

参考: Just另一个Java博客博客中的JCG合作伙伴 Soroosh Sarabadani的Spring可配置魔术 。

翻译自: https://www.javacodegeeks.com/2013/09/spring-configurable-magic.html

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

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

相关文章

前端解读控制反转(IOC)

前言 随着前端承担的职责越来越重&#xff0c;前端应用向着复杂化、规模化的方向发展。大型项目模块化是一种趋势&#xff0c;不可避免模块之间要相互依赖&#xff0c;此外还有很多第三方包。这样的话如何去管理这些繁杂的文件&#xff0c;是一个不可避免的话题。此时作为一种…

ASP.NET MVC传递参数(model), 如何保持TempData的持久性

一看到此标题&#xff0c;相信你也会。因为路由是可以从URL地址栏传过去的。但是Insus.NET不想在地址栏传递&#xff0c;还是一个条件是jQuery的Ajax进行POST的。Insus.NET不清楚别人是怎样处理的&#xff0c;但是这个让Insus.NET花上不少时间来解决。Insus.NET实现的方法也很简…

深度学习语音降噪方法对比_人工智能-关于深度学习的基础方法

深度学习概述深度学习的一些简介&#xff0c;其要点如下&#xff1a;深度学习实际上是基于具有多个隐藏层的神经网络的学习&#xff1b;深度学习的思想来源于人类处理视觉信息的方式&#xff1b;深度学习的发展得益于数据的井喷和计算力的飙升&#xff1b;深度学习的理论基础依…

通过adb巧用monkey获取android设备中所有应用的主activity

由于工作需要&#xff0c;想获取所有应用的activity(这里仅限应用的主入口Launcher activity)&#xff0c;搜索了一下&#xff0c;网上实现的方案都是基于android编程实现的&#xff0c;对于不懂开发的测试来说稍有难度&#xff0c;而且对于PC端测试工具来说可行性略差。 给大家…

linux转换vcf格式,如何使用awk分割vCard通讯录文件(.vcf)

写这个的缘由是某人最近要从某旧山寨手机给某(更旧的)NOKIA手机同步通讯录&#xff0c;由于某山寨android手机输出的vCard文件是单文件里面包含多个记录数据的格式&#xff0c;而NOKIA的古老同步软件只支持单记录vcf&#xff0c;所以就要将单个vCard文件分割成多个vcf&#xff…

PWA · 前后端协作 · Node | JTalk 掘金线下活动第七期

通知 余票仅剩 3张&#xff0c;欢迎加入活动群获取更多通知。北京的小伙伴可以关注我们的 JTalk 第八期&#xff1a;前端安全 | 美团点评技术团队专场 ? 报名 扫码报名&#xff1a; 报名链接&#xff1a;点我报名 ? 介绍 本期 JTalk 来杭州啦&#xff01; 掘金线下活动 J…

替代JavaOne 2013

我对无法参加JavaOne 2013感到很失望&#xff0c;但是很高兴看到涵盖这个年度会议的大量有用帖子。 在这篇文章中&#xff0c;我链接到许多这些资源&#xff0c;并提供了每篇文章相对于JavaOne 2013讨论内容的简短摘要。 主题演讲 主题演讲是“大公告”趋向于发生的地方。 幸运…

指数函数中x的取值范围_基本初等函数I: 指数函数、对数函数和幂函数

本文大约4800字, 建议学习时间1个小时.在学习过一次函数和二次函数(修改版)后, 我们知道, 一次函数ykxb当一次项系数k大于零时是增函数, 小于零时是减函数. 二次函数yax2bxc当二次项系数a大于零时图象沿x轴从左向右先减后增, a小于零时先增后减. 可以想象, 次数更高的函数, 在定…

Linux系统之TroubleShooting(启动故障排除)

尽管Linux系统非常强大&#xff0c;稳定&#xff0c;但是我们在使用过程当中&#xff0c;如果人为操作不当&#xff0c;仍然会影响系统&#xff0c;甚至可能使得系统无法开机&#xff0c;无法运行服务等等各种问题。那么这篇博文就总结一下一些常见的故障排除方法&#xff0c;但…

皮肤可配置化:变量、样式分离

之前皮肤开发了一个版本&#xff0c;抽是抽出来了&#xff0c;但是变量只抽出了几个颜色&#xff0c;没什么价值&#xff08;上个版本开发过程&#xff09;&#xff0c; 这次我又进行了一次迭代&#xff0c;现在是一个较成熟的版本了。整体理一下思路&#xff0c;可以总结为3步…

linux下jboss分析helloword,JBoss 中运行servlet 的helloworld程序(转)

一..在server/default/deploy下创建test.war文件夹在test.war 下建WEB-INF文件夹在WEB-INF下建classes文件夹和web.xml二、运行在C:\jboss-3.2.1_tomcat-4.1.24\bin下点击run.bat运行。测试方法如下&#xff1a;http://localhost:8080/jmx-console看到jmx agent view表示成功三…

【考试记录】4.8 Path (网络流 —— 劲题)

手抄代码 学习指针 冥思苦想一晚上终于——在一瞬间开窍了。果然题目都是这样&#xff1a;突破了一个点&#xff0c;一切都是柳暗花明。 题面描述&#xff1a; 样例&#xff1a; 这道题目&#xff0c;首先注意到给定的边的性质&#xff1a;这些边在平面上构成了一棵树&#x…

Servlet 3.0概述

Servlet 3.0 –具有许多突破性的功能&#xff0c;这些功能最终将改变开发人员编写和编写JEE Web应用程序的方式–有人可能会说&#xff0c;它的约定违背了我们对事物在理论上“应该”如何工作的大多数理解&#xff0c;但这就是其中之一。创新和持续改进&#xff1b; 挑战公约并…

MySQL(介绍,安装,密码操作,权限表)

一、数据库介绍1、数据库相关概念a、支持并发b、锁的问题c、对客户端请求进行认证d、存取效率&#xff08;降低IO次数&#xff09;数据库服务器&#xff08;本质就是一个台计算机&#xff0c;该计算机之上安装有数据库管理软件的服务端&#xff09;数据库管理管理系统RDBMS&…

matlab如何测两点的角度_【邢不行|量化小讲堂系列01-Python量化入门】如何快速上手使用Python进行金融数据分析...

引言:邢不行的系列帖子“量化小讲堂”&#xff0c;通过实际案例教初学者使用python进行量化投资&#xff0c;了解行业研究方向&#xff0c;希望能对大家有帮助。【历史文章汇总】请点击此处【必读文章】&#xff1a;【邢不行|量化小讲堂系列27-Python量化入门】EOS期现套利&…

结对项目

一、【Coding.Net项目地址】https://git.coding.net/verde/Pair_Work.git 二、【对接口进行的设计】 看教科书和其它资料中关于Information Hiding, Interface Design, Loose Coupling的章节&#xff0c;说明你们在结对编程中是如何利用这些方法对接口进行设计的。 如下图SRC的…

amd 安装 linux驱动怎么安装教程,请教,怎么在ubuntu里安装amd显卡驱动

AMD发布新版本时fglrx-updates驱动就会自动升级&#xff0c;但其实并不总是这样&#xff0c;因为Ubuntu的源的更新老是会有延迟。所以&#xff0c;你可以自己安装指定版本的专有驱动。准备开始吧&#xff0c;在终端敲入以下命令&#xff1a;sudo apt-get install build-essenti…

node.js中exports与module.exports的区别分析

前言 关于Node.js中的exports和module.exports&#xff0c;很多时候都比较容易让人混淆&#xff0c;弄不清楚两者间的区别。那么我们就从头开始理清这两者之间的关系。 来源 在开发Node.js应用的时候&#xff0c;很多模块都是需要引入才能使用&#xff0c;但是为什么exports…

Java反射教程

在本教程中&#xff0c;我主要编写一些示例来介绍Java反射可以做什么。 希望它可以给您这个概念的概述。 请留下您的评论以寻求建议。 什么是反射&#xff1f; 简而言之&#xff0c;反射是程序在运行时检查和修改对象的结构和行为的能力。 这种概念有时与内省混合在一起。 自…

NFS网络共享文件系统

1、nfs服务端配置操作 1.1 创建所需的共享目录--源 mkdir /data/rw #rw代表同步的数据可读可写 1.2 对共享目录进行授权 chown -R nfsnobody.nfsnobody /data/rw #非必需&#xff0c;根据业务需求 1.3 修改nfs服务配置文件 vim /etc/exports /data/rw 172.16.1.0/…