spring aop实践_使用Spring AOP实现活动记录模式

spring aop实践

在课堂设计过程中,我们应就每个班级的职责分配做出决定。 如果我们选择的不错,系统将更易于理解,维护和扩展。

我们几乎所有的项目都有一个持久层,即关系数据库,文档存储或仅XML文件。 通常,您将使用DAO模式在业务对象和数据存储之间实现抽象接口。

在这篇文章中,但我将解释另一种可以代替DAO模式使用的模式。 活动记录模式是一种体系结构模式,它迫使您对模型类实施CRUD操作,因此模型类本身负责保存,删除和从数据库加载。

要实现此模式,有许多策略可以遵循,但是对我来说,最好的方法是使用面向方面的编程 ,因为我们仍然保持关注点分离,有利于隔离的单元测试,而不破坏封装。

面向方面的编程需要将程序逻辑分解为不同的部分。 这些部分被称为横切关注点,因为它们“ 跨越 ”程序中的多个抽象。 横切关注点的示例可以是日志记录,事务管理器错误管理器拆分大型数据集 。 对于在这里没有太多秘密的方面的人们来说,要使用它们,只需创建定义建议和切入点的方面,然后就可以执行您的方面了。

我想我们大多数人都使用了上一段中所述的面向方面的编程,但是使用ITD(类型间声明)功能的人会更少。

类型间声明提供了一种表达横切关注点的方法,这些关注点影响了模块的结构,从而使程序员可以声明另一个类的成员。

正如我们在我的国家说“ 不好说,但很好理解 “,ITD是从一个方面宣布新的组件属性,方法,注解 )的方式。

AspectJ是Java 的面向方面的扩展。 AspectJ支持ITD ,因此在本文中将使用它。 此外,我建议您安装AJDT插件,因为它将帮助您开发方面,并快速概述了哪些Java类已被方面化。

如果您不了解什么是ITD ,请不用担心,这是一个典型的概念示例,最好通过示例来理解。

让我们从一个简单的例子开始:

想象一下必须为汽车建模。 您将拥有一个带有某些属性的汽车类,在此示例中,三个属性( vin号,行驶里程model )就足够了。

public class Car {public void setVin(String vin) {this.vin = vin;}public String getVin() {return this.vin;}private String vin;public void setMileNum(int mileNum) { this.mileNum = mileNum;}public int getMileNum() {return this.mileNum;}private int mileNum;public void setModel(String model) {this.model = model;}public String getModel() {return this.model;}private String model; }

这是一个具有三个属性以及它们的gettersetterPOJO

现在我们要添加持久层,但是在这种情况下,我们将POJO持久保存在XML文件而不是数据库中。 因此,应将Car对象转换为XML流。 为此,将使用JAXB批注。 对于那些不知道的人, JAXB允许开发人员将Java类映射到XML表示,反之亦然。

我确信,想到的第一个想法是使用@XmlRootElement注释Car类(在JAXB中映射根元素的注释)。 不要那样做,使用方面 。 您的第一个任务是尝试维护Car文件尽可能简单。 要使用ITD添加注释,很简单:

public aspect Car_Jaxb {declare @type: Car: @XmlRootElement;
}

使用@type可以公开注释哪个成员。 在这种情况下,只能上课。 其他方法是@method@constructor@field 。 然后元素模式应该被注释,在这种情况下是Car类,但是您可以使用任何正则表达式,例如o rg.alexsotob .. *。 最后是注释

下一步是使用JAXB类来编组/解组对象。 在此示例中,我使用spring-oxm软件包,简要地您将了解原因。 Spring-oxmspring-core的一部分,其中包含用于处理O / X Mapping的类

这个spring模块为每个受支持的Xml绑定包含一个类。 在我们的情况下, Jaxb2Marshaller用作编组器和解组器。

您可能正在考虑创建一个服务类,在其中注入Jaxb2Marshaller实例。 该服务将包括两个方法(保存和加载),以Car类作为参数或返回值。 抱歉,这样做是要实现DAO模式。 让我们实现Active Record模式方法。 正如您可能会想到的, aspectj可以帮助您避免将概念混入同一源文件中。

让我们更新以前的方面文件,以便JAXB所需的所有逻辑都在同一文件中。

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;public aspect Car_Jaxb {declare @type: Car: @XmlRootElement;@Autowiredtransient Jaxb2Marshaller Car.marshaller;public void Car.save(OutputStream outputStream) throws IOException {this.marshaller.marshal(this, new StreamResult(outputStream));}public Car Car.load(InputStream inputStream) throws IOException {return (Car)this.marshaller.unmarshal(new StreamSource(inputStream));}}

看到除了注释Car类之外,我们还创建了两个方法和一个带注释的属性。 属性必须遵循与方法,< 类名 >点(。)和< 属性名 >相同的规则。 请注意,在这种情况下,属性是瞬态的,因为不应绑定到XML文件中。

最后一步是在spring上下文文件中配置marshaller

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:oxm="http://www.springframework.org/schema/oxm"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"><oxm:jaxb2-marshaller id="marshaller"><oxm:class-to-be-bound name="org.alexsotob.itd.Car"/></oxm:jaxb2-marshaller></beans>

没有太多秘密。 现在让我们编写一个单元测试代码。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="/context.xml")
public class CarOxmBehaviour {@Testpublic void shouldSaveCarToXml() throws Exception {//GivenCar car = new Car();car.setMileNum(1000);car.setModel("Ferrari");car.setVin("1M8GDM9AXKP042788"); //From http://en.wikipedia.org/wiki/Vehicle_Identification_Number//WhenByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();car.save(byteArrayOutputStream);//ThenString expectedMessage = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><car><mileNum>1000</mileNum><model>Ferrari</model><vin>1M8GDM9AXKP042788</vin></car>";String xmlMessage = byteArrayOutputStream.toString("UTF-8");assertThat(the(xmlMessage), isEquivalentTo(the(expectedMessage)));  }}

用令人惊讶的NullPointerException运行红色的junit类和BOOMMarshaller是在Spring上下文中创建的,但未注入Car类(Car不是由spring 容器管理的,因此无法注入)。 现在,我想您是对自己说的:“ 我告诉您,服务层会更好,因为它将由Spring进行管理,并且自动装配功能会非常完美 。” 但是,拭目以待。 如何使用spring-aspects模块? Spring Aspects包含一个注释驱动的方面( @Configurable ),允许任何对象的依赖项注入,无论是否由容器控制。 因此,让我们应用最后两个更改,应用程序将运行。

首先是创建一个新的aspectj文件,以将Car类注释为Configurable

import org.springframework.beans.factory.annotation.Configurable;public aspect Car_Configurable {declare @type: Car: @Configurable;}

最后修改spring上下文文件以允许@Configurable注释。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:oxm="http://www.springframework.org/schema/oxm"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"><oxm:jaxb2-marshaller id="marshaller"><oxm:class-to-be-bound name="org.alexsotob.itd.Car"/></oxm:jaxb2-marshaller><context:spring-configured></context:spring-configured>
</beans>

添加< context:spring-configured > </ context:spring-configured >命名空间就足够了。 结果,每当您实例化一个对象(通过“ new ”关键字)时,Spring都会尝试对该对象执行依赖注入。

现在再次运行单元测试,绿色将侵入您的计算机:D。

ITD是一个很好的解决方案,可以自己负责设计类。 它为您提供了编写可维护且易于理解的代码的机会,而不会丢失封装。 当然,您应该注意不要在方面类中具有很高的耦合,而应将它们转换为“上帝类”。

注意,实现相同的方法但使用关系数据库,就像将Jaxb2Marshaller更改为EntityManager一样简单。

我希望您发现这篇文章有用。

下载完整代码

参考:来自JCG合作伙伴的 Spring AOP实现活动记录模式   在一个罐子统治他们所有博客的亚历克斯·索托。


翻译自: https://www.javacodegeeks.com/2012/02/implementing-active-record-pattern-with.html

spring aop实践

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

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

相关文章

iOS:Cocoa编码规范 -[译]Coding Guidelines for Cocoa

转载:http://blog.csdn.net/houseq/article/details/27369043 原文地址&#xff1a;https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/FrameworkImpl.html Cocoa编码规范 --前言 用公共API开发一个Cocoa框架&#xff0c;插件…

部署promethues采集kubelet数据报错:server returned HTTP status 403 Forbidden

背景 笔者尝试部署手动部署promethues去采集kubelet的node节点数据信息时报错 笔者的promethus的配置文件和promthues的clusterrole配置如下所示&#xff1a; apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:name: prometheus rules: - apiGroups: […

p服务器不响应,无法加载资源:服务器响应状态为500

这里我; m使用角度与mvc当我; m试图发送数据我收到错误如上所示&#xff0c;我也得到一些脚本errr无法加载资源&#xff1a;服务器响应状态为500$scope.DeleteCustomer function(list) {var itemList [];angular.forEach(list, function(value, key) {if (list[key].selected…

【CSS系列】CSS 实现必填项前/后添加红色星号

在一些必填项的标签加星&#xff0c;来提示用户&#xff0c;怎么实现呢&#xff1f;请看本文介绍的两种方法。 1 . 常规写法 <label><span style"color:red;">* </span>孙叫兽 : </label> <input type"text" value""…

二分答案1

ACM中的工作分配问题是一个典型的回溯问题&#xff0c;利用回溯思想能很准确地得到问题的解。下面就这个问题好好分析下。 问题描述&#xff1a; 设有n件工作分配给n个人。为第i个人分配工作j所需的费用为c[i][j] 。试设计一个算法&#xff0c;计算最佳工作分配方案&#xff0c…

sun.misc.Unsafe苦难告诉我们什么

Oracle将删除Java 9中的内部sun.misc.Unsafe类 。 尽管大多数人可能对这种变化漠不关心&#xff0c;但其他一些人&#xff08;主要是图书馆开发人员&#xff09;并非如此。 博客圈中最近有几篇文章描绘了这种变化所暗含的含义&#xff1a; Dripstat 删除了Java 9中的sun.misc.…

2k16显示miui停止服务器,MIUI11停止内测,MIUI12真的来了,与小米MIX4同天发布,与ios13一样流畅丝滑...

原标题&#xff1a;MIUI11停止内测&#xff0c;MIUI12真的来了&#xff0c;与小米MIX4同天发布&#xff0c;与ios13一样流畅丝滑根据miui官方给出的最新公告&#xff0c;现在miui11最后一个开发版基本停止内测&#xff0c;并称“永远相信美好的事情即将发生”&#xff0c;可以确…

【APICloud系列|42】安卓应用和ios应用下载地址生成一个统一二维码的解决办法

前言:这个需要自己的应用已经上线到腾讯应用宝、APPStore. 目录 终极解决办法 原因如下 「微下载」操作指南 推荐两个生成链接的平台

设计之路:如何进行软件需求分析?

1、需求分析的重要性 软件需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。 通常&#xff0c;软件生存周期包括可行性分析与开发项计划、需求分析、设计&#xff08;概要设计和详细设计&#xff09;、编码、测试、维护等活动。 常用的三种软件生命周期&a…

如何学好初中计算机,初中生怎么学习方法好 十大方法告诉你

1、学会建目录。一本教科书大约有十章&#xff0c;每章几页&#xff0c;十几页以上&#xff0c;包含许多标题&#xff0c;每个标题包含许多副标题&#xff0c;每个副标题包含一些知识点。当你第一次阅读时&#xff0c;根据章节&#xff0c;提取标题和知识指出&#xff0c;写笔记…

wadl 生成java_在Spring MVC REST应用程序中自动生成WADL

wadl 生成java上一次我们学习了WADL的基础知识 。 语言本身并没有那么有趣&#xff0c;只写了一篇有关它的文章&#xff0c;但是本文的标题揭示了为什么我们需要这些知识。 JSR 311的许多实现&#xff1a;JAX-RS&#xff1a;RESTful Web服务的Java API提供了开箱即用的运行时WA…

使用js设置ul标签的显示或隐藏和超链接调用js文件的方法

<ul class"nav" id"rm" styledisplay:none> <li> <a href# onclickRepayment() >还款信息</a></li> </ul> document.getElementById("rm").style.display"none" 转载于:https://www.cnblogs.co…

安卓应用和ios应用下载地址生成一个统一二维码

前言&#xff1a;这个需要自己的应用已经上线到腾讯应用宝、APPStore.终极解决办法腾讯应用宝「微下载 」&#xff0c;是目前生成二合一APP推广二维码的最佳方式。原因如下1. 微信仅支持应用宝「微下载」&#xff0c;才能直接下载APP● 微信拥有11亿用户量&#xff0c;“扫一扫…

css居中悬浮,CSS悬浮居中

百分比&悬浮栏.box{width:90%;background-color:gray;border:0px solid #000;margin-left:-45%;/*margin数值相当于width数值的负一半*/font-size:16px;/*行高默认为*/position:fixed;top:0%;left:50%;/*left数值永远等于50%(想要居中的话)*/text-align:center;color:#fff;…

在Java SE中使用Hibernate Bean Validator

Bean Validation主页上指出&#xff1a;“ Bean Validation是Java规范&#xff0c;…在Java SE中运行&#xff0c;但集成在Java EE&#xff08;6和7&#xff09;中。” 这篇文章演示了如何在Java EE容器之外使用Java Bean验证参考实现&#xff08; Hibernate Validator &#x…

程序员应该如何才能买房?

前段时间对象问我应该在哪买房&#xff0c;我的意见是现在一个小的城市搞个刚需房&#xff0c;后面可以再换个一线的大房子&#xff0c;后来她的建议是在工作附近搞一套&#xff0c;这样不用一边工作一边还房贷。无奈只能咨询各位大咖。看完这个大佬的经历&#xff0c;发现好多…

css规则的样式构成,Css 基本的规则写法

样式表的写法&#xff1a;css的语法由一些标志构成&#xff0c;就是一个基本的样式表由选择器&#xff0c;属性和属性值构成。Css有标准的写法规则标准的css写法&#xff1a;h1 {Font-family:黑体;}h1:表示选择符Font-family:表示属性&#xff0c;这里的作用是定义字体"黑…

nginx 虚拟主机

环境:2台web服务器&#xff0c;1台nginx服务器&#xff0c;1台客户端 1、配置2台web服务器(关闭iptables&#xff0c;关闭selinux) yum -y install httpd service httpd start exho "192.168.1.10" > /var/www/html/index.html exho "192.168.1.100"…

小程序开发从0到1

公司最近也想做小程序&#xff0c;简单梳理了一下&#xff0c;希望能给新人带来一点启发。 话不多说&#xff0c;直接上干货。 不是码农也想开发的直接采用混合式开发的方案&#xff0c;查漏补缺&#xff0c;用模板肯定会有点生硬&#xff0c;想走的更远建议还是采用原生开发的…

王者荣耀服务器维护啥时候结束,王者荣耀维护几点结束今天?11月10日维护公告...

王者荣耀维护今天几点结束&#xff1f;今天王者荣耀要进行全服的维护了&#xff0c;到时候服务器会选择性的轮流更新&#xff0c;到时候会有玩家登不上游戏&#xff0c;这都是正常的。这次的维护时间非常短只有一个半小时&#xff0c;不过你运气好的话&#xff0c;你的区域会优…