ug弹簧可变性装配_弹簧可配置魔术

ug弹簧可变性装配

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

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

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

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

但是有一些缺陷,您的代码将无法测试需要测试日期断言的部分(我将尽快编写一系列的post bout Test和Testable代码)。

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

因此,拥有一种满足这些要求的机制非常有价值。 作为此示例中的简单解决方案,我将创建一个环境接口,该接口具有一个方法(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

ug弹簧可变性装配

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

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

相关文章

C语言课程设计报告输出杨辉三角,C语言学习:在屏幕上输出杨辉三角

杨辉三角的规律是&#xff1a;它的两条斜边都是由数字1组成的&#xff0c;而其余的数则是等于它肩上的两个数之和。 代码如下&#xff1a;#include#includeint main(){int i,j,k,arr[10][10]{0};/*arr[11][11]必须初始化&#xff0c;初始化为{0}*/printf("打印出杨辉三角&…

朴实!简单!依你所好,MySQL排序查询ORDER BY

1、基本语法 SELECT查询列表 FROM表 #可选&#xff08;WHERE ...&#xff09; ORDER BY排序列表 DESC/ASC;升序是ASC或者不写&#xff0c;降序是DESC 2、案例一&#xff1a;按字段&#xff08;*代表全部&#xff09; SELECT* FROMemployees ORDER BYsalary DESC;3、案例二&am…

使用一个命令执行单个Java源文件

JDK增强提案 &#xff08; JEP &#xff09; 草案于2017年末创建&#xff0c;名为“ 启动单文件源代码程序 ”&#xff08;其相关的JDK问题为JDK-8192920 &#xff09;。 顾名思义&#xff0c;该JEP草案旨在“增强Java启动器以支持运行作为Java源代码的单个文件提供的程序。” …

习惯性朴实简单!一起学习MySQL常见单行函数,字符数学日期流程控制

文章目录一、字符函数二、数学函数三、日期函数四、其他函数五、流程控制函数一、字符函数 1、大小写控制函数 ①UPPER()&#xff1a;转换成大写 SELECT UPPER(Hello);②LOWER()&#xff1a;转换成小写 SELECT LOWER(Hello);2、字符控制函数 ①LENGTH()&#xff1a;获取参数…

c语言程序设计陈雪芳,东莞理工学院C语言课程设计.doc

東莞理工學院C语言程序设计课程设计报告书院系名称 机械工程学院专业班级 2013级机械设计制造及其自动化1班组长成员指导教师 陈雪芳完成时间 2014年6月1日目 录1、系统功能及任务描述………………………..1.1系统总体功能描述………………………….1.2主要任务描述…………………

不可上位!数据结构队列,老实排队,Java实现数组模拟队列及可复用环形队列

文章目录队列简介数组模拟队列&#xff08;无法复用&#xff09;数组模拟环形队列&#xff08;可复用&#xff09;队列简介 队列是一个有序列表&#xff0c;可以用数组或是链表来实现。 遵循先入先出的原则。即先存入队列的数据&#xff0c;先取出&#xff0c;后存入的后取出…

c语言循环与数组训练题,C语言循环数组练习题解读.doc

循环数组练习题一&#xff0e;选择题1&#xff0e;for(i0;i<10;i); 结束后&#xff0c; i 的值是&#xff1b; BA9B10C11D122&#xff0e;下面程序的循环次数是&#xff1a;Dint k0;while(k<10){if(k<1)continue;if(k5)break;k;}A.5B6C4D 死循环&#xff0c;不能确定循…

Java更快地对基元数组进行排序?

看起来Java的原语排序数组在不久的将来可能会提高性能。 弗拉基米尔雅罗斯拉夫斯基&#xff08;Vladimir Yaroslavskiy&#xff09;已在core-libs-dev邮件列表中发布了一条消息 &#xff0c;标题为“ Dual-Pivot Quicksort的新优化版本 ”&#xff0c;其中Yaroslavskiy撰写了“…

多对一!分组查询!MySQL分组函数,聚合函数,分组查询

文章目录一、简单使用二、搭配DISTINCT去重三、COUNT()详细介绍四、分组查询一、简单使用 SUM&#xff1a;求和&#xff08;一般用于处理数值型&#xff09; AVG&#xff1a;平均&#xff08;一般用于处理数值型&#xff09; MAX&#xff1a;最大&#xff08;也可以用于处理字…

华工网络教育C语言校考答案,计算机应用基础(统考)随堂练习2017秋华工答案.docx...

计算机应用基础(统考)随堂练习第一章计算机基础知识计算机能直接识别并执行的语言是 ______。A. 汇编语言B.自然语言C.机器语言D.高级语言答题&#xff1a;A. B. C. D.参考答案&#xff1a; C计算机存储容量的基本单位是 _____。A. 赫兹B.字节( Byte)C.位 (bit)D. 波特答题&…

数据结构单链表SingleLinkedList,Java实现单链表增删改查

文章目录链表介绍应用示例链表介绍 链表是有序的列表&#xff0c;但是它在内存中是存储是不连续的&#xff0c;如下&#xff1a; 链表是以节点的方式来存储&#xff0c;是链式存储&#xff1a; ①每个节点包含data域存储数据&#xff0c;next域指向下一个节点 ②链表的各个节点…

c语言队列原理的实现,c印记(十二):队列queue原理与实现

一、简而言之在百度百科里面摘取了一段关于队列(queue)的介绍&#xff1a;队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端(front)进行删除操作&#xff0c;而在表的后端(rear)进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。…

通用版!完整代码,单链表SingleLinkedList增删改查,反转,逆序,有效数据等Java实现

文章目录节点类链表类&#xff08;主要&#xff09;测试类小结节点类 可以根据需要&#xff0c;对节点属性进行修改。注意重写toString()方法&#xff0c;以便后续的输出操作。 //节点类 class Node {public int id;public String name;public Node next;public Node(int id,…

Java 10 – JEP 286:局部变量类型推断

Java 10即将发布&#xff0c;RC Build可在此处获得 。 可在此处找到此发行版的目标功能。 在针对Java 10的所有JEP中&#xff0c;开发人员社区中最有趣且最受关注的是286&#xff1a;Local-Variable Type Inference 。 什么是局部变量类型推断&#xff1f; 我们在Java 8中看到…

w ndows7与XP哪个好,Win7系统与Win XP系统哪个更好?Windows7与WindowsXP区别介绍-系统城·电脑系统下载之家...

虽然微软已经停止对xp系统的维护&#xff0c;但是仍有不少用户有这样一个疑惑&#xff1a;Win7系统与WinXP系统哪个更好&#xff1f;接下来&#xff0c;小编就向大家具体介绍Windows7与WindowsXP的区别&#xff0c;让你知道到底哪个系统会更好一些。首先跟系统城小编一起来看微…

一文完整MySQL连接查询,笛卡尔乘积,内连接外连接交叉连接

文章目录笛卡尔乘积连接查询分类等值连接非等值连接自连接外连接交叉连接连接查询又称为多表查询&#xff0c;当查询的字段来自于多个表时&#xff0c;使用连接查询。 笛卡尔乘积 笛卡尔乘积现象&#xff1a;表1有m行&#xff0c;表2有n行&#xff0c;结果有m*n行 发生原因&a…

android 自定义表单,Android实现Ant Design 自定义表单组件

Ant Design 组件提供了Input&#xff0c;InputNumber&#xff0c;Radio&#xff0c;Select&#xff0c;uplod等表单组件&#xff0c;但实际开发中这是不能满足需求&#xff0c;同时我们希望可以继续使用Form提供的验证和提示等方法(使用起来确实很爽)&#xff0c;这时需要自己动…

逆向行驶!数据结构双向链表DoubleLinkedList,Java实现增删改查

文章目录节点类链表类测试类双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。 节点类…

【PostmanJMeter】使用Postman和JMeter进行signature签名

一、前言 ​ 有些接口的请求会带上sign&#xff08;签名&#xff09;进行请求&#xff0c;各接口对sign的签名内容、方式可能不一样&#xff0c;但一般都是从接口的入参中选择部分内容组成一个字符串&#xff0c;然后再进行签名操作, 将结果赋值给sign; 完整规范的接口文档都会…

詹金斯搭建_詹金斯的Maven报告

詹金斯搭建代码质量是一个敏感的话题。 它会影响您的维护成本以及客户满意度。 更不用说您的开发人员使用代码的动力了。 谁想要修复难看的代码&#xff0c;对吗&#xff1f; 讨论代码质量总是需要事实和数字&#xff01; 因此&#xff0c;这是一个简短的教程&#xff0c;介绍…