比较分析 Spring AOP 和 AspectJ 之间的差别

比较分析 Spring AOP 和 AspectJ 之间的差别

英文原文:Comparative Analysis Between Spring AOP and AspectJ

标签: AspectJ Spring
参与翻译(2人):
bearkidult, super0555
仅中文 | 中英文对照 | 仅英文 | 打印此文章

面向方面的编程(AOP) 是一种编程范式,旨在通过允许横切关注点的分离,提高模块化。AOP提供方面来将跨越对象关注点模块化。虽然现在可以获得许多AOP框架,但在这里我们要区分的只有两个流行的框架:Spring AOP和AspectJ。这里将会帮助你基于一些关键信息,为你的项目选择正确的技术。

Spring AOP不同于大多数其他AOP框架。Spring AOP的目的并不是为了提供最完整的AOP实现(虽然Spring AOP具有相当的能力);而是为了要帮助解决企业应用中的常见问题,提供一个AOP实现与Spring IOC之间的紧密集成。由于Spring AOP是容易实现的,如果你计划在Spring Beans之上将横切关注点模块化,Spring的这一目标将是要点之一。但同样的目标也可能成为一个限制,如果你用的是普通的Java对象而不是Spring beans,并基于此将横切关注点模块化的话。另一方面,AspectJ可用于基于普通Java对象的模块化,但在实施之前需要良好的关于这个主题的知识。

super0555
super0555
翻译于 3年前

3人顶

顶 翻译的不错哦!

在决定使用哪种框架实现你的项目之前,有几个要点可以帮助你做出合适的选择(同样适用于其他框架)。

Spring AOP致力于提供一种能够与Spring IoC紧密集成的面向方面框架的实现,以便于解决在开发企业级项目时面临的常见问题。明确你在应用横切关注点(cross-cutting concern)时(例如事物管理、日志或性能评估),需要处理的是Spring beans还是POJO。如果正在开发新的应用,则选择Spring AOP就没有什么阻力。但是如果你正在维护一个现有的应用(该应用并没有使用Spring框架),AspectJ就将是一个自然的选择了。为了详细说明这一点,假如你正在使用Spring AOP,当你想将日志功能作为一个通知(advice)加入到你的应用中,用于追踪程序流程,那么该通知(Advice)就只能应用在Spring beans的连接点(Joinpoint)之上。

bearkidult
bearkidult
翻译于 3年前

4人顶

顶 翻译的不错哦!

例子:在appbeans.xml中配置如下的切入点(pointcut),那么当调用myServices bean的service方法时就将应用日志通知(advice)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!—Configuration snippet in appbeans.xml -->
  <bean id="myServices" class="com.ashutosh.MyServicesImpl " />
  <aop:config>
    <aop:aspect id="loggingAspect" ref="logging">
       <aop:around method="log" pointcut="execution(public * *(..))"/>
   </aop:aspect>
 </aop:config -->
// Java file calling service method
ApplicationContext beans =newClassPathXmlApplicationContext("appbeans.xml");
MyServices myServices = (MyServices) beans.getBean("myServices");
myServices.service(); // Logging advice applied here

看一下日志通知将要被应用处的注释,在这里应用程序将记录被调用方法的详细信息。但是,当你在service()方法中调用同一个类中的其他方法时,如果你没有使用代理对象,那么日志通知就不会被应用到这个方法调用上。

例如:

?
1
2
3
4
5
6
7
// MyServices service method
public void service() {
  performOperation();// Logging advice not going to apply here
}

如果你想要在通过this对象调用的方法上应用通知,那么你必须使用currentProxy对象,并调用其上的相应方法。

?
1
2
3
4
5
6
7
8
9
// MyServices service method
public void service() {
  // Logging advice going to apply here
  ((MyServices) AopContext.currentProxy()).performOperation();
}

于此相似,如果你想要在某对象的方法上应用通知,那么你必须使用与该对象相应的Spring bean。

?
1
2
3
4
5
6
7
public void service() {
  MyObject obj = new MyObject();
  Obj.performOperation();// Logging advice not going to apply here
}

如果你想要应用该通知,那么上述代码必须修改为如下形式。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public void service() {
  MyObject obj = new MyObject();
 Obj.performOperation();// Logging advice not going to apply here
 ApplicationContext beans =newClassPathXmlApplicationContext("appbeans.xml");
 MyObject obj =(MyObject) beans.getBean("myObject");
 obj.performOperation()// Logging advice applied here
}

于此不同,使用“AspectJ”你可以在任何Java对象上应用通知,而不需要在任何文件中创建或配置任何bean。

bearkidult
bearkidult
翻译于 3年前

3人顶

顶 翻译的不错哦!

另一个需要考虑的因素是,你是希望在编译期间进行织入(weaving),还是编译后(post-compile)或是运行时(run-time)。Spring只支持运行时织入。如果你有多个团队分别开发多个使用Spring编写的模块(导致生成多个jar文件,例如每个模块一个jar文件),并且其中一个团队想要在整个项目中的所有Spring bean(例如,包括已经被其他团队打包了的jar文件)上应用日志通知(在这里日志只是用于加入横切关注点的举例),那么通过配置该团队自己的Spring配置文件就可以轻松做到这一点。之所以可以这样做,就是因为Spring使用的是运行时织入。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<!—Configuration -->
<bean id="myServices" class="com.ashutosh.MyServicesImpl " />
 <aop:config>
  <aop:aspect id="loggingAspect" ref="logging">
      <aop:around method="log" pointcut="execution(public * *(..))"/>
  </aop:aspect>
</aop:config -->

如果你使用AspectJ想要做到同样的事情,你也许就需要使用acj(AspectJ编译器)重新编译所有的代码并且进行重新打包。否则,你也可以选择使用AspectJ编译后(post-compile)或载入时(load-time)织入。

bearkidult
bearkidult
翻译于 3年前

3人顶

顶 翻译的不错哦!

因为Spring基于代理模式(使用CGLIB),它有一个使用限制,即无法在使用final修饰的bean上应用横切关注点。因为代理需要对Java类进行继承,一旦使用了关键字final,这将是无法做到的。

例如,在Spring bean MyServicesImpl上使用关键字final,并配置一个“execution(public * *(..))”这样的切入点,将导致运行时异常(exception),因为Spring不能为MyServicesImpl生成代理。

?
1
2
3
4
5
6
7
8
9
10
11
// Configuration file
<bean id="myServices" class="com.ashutosh.MyServicesImpl" />
//Java file
public final classMyServicesImpl {
  ---
}

在这种情况下,你也许会考虑使用AspectJ,其支持编译期织入且不需要生成代理。

于此相似,在static和final方法上应用横切关注点也是无法做到的。因为Spring基于代理模式。如果你在这些方法上配置通知,将导致运行时异常,因为static和final方法是不能被覆盖的。在这种情况下,你也会考虑使用AspectJ,因为其支持编译期织入且不需要生成代理。

bearkidult
bearkidult
翻译于 3年前

2人顶

顶 翻译的不错哦!

你一定希望使用一种易于实现的方式。因为Spring AOP支持注解,在使用@Aspect注解创建和配置方面时将更加方便。而使用AspectJ,你就需要通过.aj文件来创建方面,并且需要使用ajc(Aspect编译器)来编译代码。所以如果你确定之前提到的限制不会成为你的项目的障碍时,使用Spring AOP。

使用AspectJ的一个间接局限是,因为AspectJ通知可以应用于POJO之上,它有可能将通知应用于一个已配置的通知之上。对于一个你没有注意到这方面问题的大范围应用的通知,这有可能导致一个无限循环。

bearkidult
bearkidult
翻译于 3年前

2人顶

顶 翻译的不错哦!

例如,创建一个包含如下切入点的方面。

?
1
2
3
4
5
6
7
8
9
public aspectLogging {
  Object around() : execution(public * * (..))
  Sysytem.out.println(thisJoinPoint.getSignature());
  return proceed();
}

在这种情况下,当proceed即将被调用时,日志通知会被再次应用,这样就导致了嵌套循环。

所以,如果你希望在Spring bean上采取比较简单的方式应用横切关注点时,并且这些bean没有被标以final修饰符,同时相似的方法也没有标以static或final修饰符时,就使用Spring AOP吧。相比之下,如果你需要在所提到的限制之上应用横切关注点,或者要在POJO上应用关注点,那么就使用AspectJ。你也可能选择同时使用两种方法,因为Spring支持这样。

参考链接:http://docs.spring.io/spring/docs/3.0.x/reference/aop.html

转载于:https://www.cnblogs.com/developer-ios/p/5611617.html

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

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

相关文章

linux下Epoll实现简单的C/S通信

From: http://blog.csdn.net/piaojun_pj/article/details/6103709 epoll的优点&#xff1a; 1.支持一个进程打开大数目的socket描述符(FD) select 最不能忍受的是一个进程所打开的FD是有一定限制的&#xff0c;由FD_SETSIZE设置&#xff0c;默认值是2048。对于那些需要支持…

什么是跨域?跨域如何解决

什么是跨域&#xff1f; A页面访问B页面的资源&#xff0c;如果A&#xff0c;B页面的域名、端口、协议、IP其中一个不同&#xff0c;这种行为都叫跨域&#xff1b; 它是由于浏览器的同源策略形成的&#xff0c;也是对javascript的安全限制&#xff1b; 什么是同源&#xff1…

微信小程序打开pdf文件;uni-app下载打开pdf文件;uni-app微信小程序下载打开pdf文件预览;

1.首先需要在小程序后台-开发设置-服务器域名 配置好下载的域名。不配置&#xff1a;会导致下载失败和打开文件失败&#xff1b; 2.pdf文件的url要确保可以浏览器直接打开。 <template><view class"pdf"><view v-for"(item,index) in pdfList&q…

Dynamips结合VMware搭建站点到站点×××环境

Dynamips是现如今最好的思科模拟器&#xff0c;它能够加载的思科IOS&#xff0c;模拟出真实的路由器&#xff0c;这使得我们在没有思科设备的情况下也能很好的学习&#xff0c;Dynamips的强大之处不仅于此&#xff0c;它还能与我们的VMware虚拟机&#xff0c;甚至和真机实行互连…

httpd设置HTTPS双向认证

去年用tomcat、jboss配置过HTTPS双向认证&#xff0c;那时候主要用的是JDK自带的keytool工具。这次是用httpd openssl&#xff0c;区别比较大 在网上搜索了很多文章&#xff0c;发现全面介绍的不多&#xff0c;或者就是版本比较旧了。所以把我配置的过程完整地记录下来&#x…

微信小程序通讯录功能;uni-app微信小程序通讯录单选;uni-app微信小程序通讯录多选;uni-app微信小程序通讯录好友功能;uni-indexed-list使用;通讯录高度修改;

介绍&#xff1a;项目使用的是uni-app做的微信小程序&#xff1b;uni-app里原来就用一个组件uni-indexed-list&#xff0c;是用来做通讯录的&#xff1b;可以直接看官方案例也就是hello-uniapp-master下的导航栏&#xff1b;但是官方这个是多选&#xff0c;且没有默认选中功能&…

C#中的Liststring泛型类示例

在C#代码中使用一系列字符串(strings)并需要为其创建一个列表时&#xff0c;List<string>泛型类是一个用于存储一系列字符串(strings)的极其优秀的解决办法。下面一起有一些List<string>泛型类的示例&#xff0c;一起来看看吧。 List示例 下面是一个使用C#创建一…

去掉数组左右两边的引号

情况是这样的一个数组 [] 正则去掉 "[]" 数组旁边的引号&#xff1b;下面就是方法&#xff08;因为编译存数据库的时候&#xff0c;取出来成字符串了&#xff0c;多了给引号&#xff0c;所以要去掉&#xff09; .replace(/^\"|\"$/g,)

Windows Sockets 错误码及出错原因

From: http://blog.csdn.net/mjay1234/article/details/7684316 Windows Sockets在头文件winsock.h中定义了所有的错误码&#xff0c;它们包括以“WSA”打头的Windows Sockets实现返回的错误码和Berkeley Sockets定义的错误码全集。定义Berkeley Sockets错误码是为了确保原有…

【jq】c#零基础学习之路(1)Hello World!

从今天起我会持续发表&#xff0c;这个就是一个日记型的&#xff0c;学习编程是枯燥的&#xff0c;况且我们还是零基础。 学前准备 1、编译环境 vs2010、vs2012、vs2015...&#xff08;本人用的是vs2010旗舰版&#xff09;。vs2010就是一个平台&#xff0c;我们用的编程语言是c…

推荐! el-input 输入框类型;只能输入数字的输入框;保留两位小数输入框;只能输入正整数和0的输入框;手机号正则校验;车牌号码正则校验

去除多余的0看这篇 以下代码可直接复制使用&#xff1a; 以下代码可直接复制使用&#xff01; <template><div><a href"https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215?fraladdin#10">百度正则</a&…

linux的搜索和时间

今天学了一些&#xff0c;学了在linux内关键字搜索&#xff0c;还有它的一些设定和选项。 还有linux的时间问题&#xff0c;如何查看时间&#xff0c;分段查看时间&#xff0c;月份&#xff0c;日期&#xff0c;天数&#xff0c;小时&#xff0c;分钟&#xff0c;秒数。 还有就…

Java多线程之JUC包:Semaphore源码学习笔记

若有不正之处请多多谅解&#xff0c;并欢迎批评指正。 请尊重作者劳动成果&#xff0c;转载请标明原文链接&#xff1a; http://www.cnblogs.com/go2sea/p/5625536.html Semaphore是JUC包提供的一个共享锁&#xff0c;一般称之为信号量。 Semaphore通过自定义的同步器维护了一个…

在vue项目中操作元素ref案例;

原博主链接 <!--* Description:会动的词云* Author: Vergil* Date: 2021-08-25 14:17:45* LastEditTime: 2021-08-25 17:08:15* LastEditors: Vergil --> <template><div class"wordCloud" ref"wordCloud"></div> </template&…

epoll.h 源码记录

epoll.h源码&#xff1a; /* Copyright (C) 2002-2013 Free Software Foundation, Inc.This file is part of the GNU C Library.The GNU C Library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as …

calc()函数及vmin,vmax,vh,vw的认识,在family里的实战运用

css的calc()函数用于动态计算长度值&#xff1b; 比如下面这个&#xff0c; font-size: calc(10px 2vmin); 控制字体缩放。 这里的vmin&#xff08;相对于视口的宽度或高度中较小的那个。其中最小的那个被均分为100单位的vmin&#xff09;&#xff1b; 比如我们的视口长1…

【C->Cpp】深度解析#由C迈向Cpp(2)

目录 &#xff08;一&#xff09;缺省参数 全缺省参数 半缺省参数 缺省参数只能在函数的声明中出现&#xff1a; 小结&#xff1a; &#xff08;二&#xff09;函数重载 函数重载的定义 三种重载 在上一篇中&#xff0c;我们从第一个Cpp程序为切入&#xff0c;讲解了Cpp的…

MySQL主从数据库配置

公司有未知台服务器&#xff0c;以后都要自己来接管。MySQL主从是必需要会的技术&#xff0c;所以加强学习一下以图以后安稳日子啊&#xff01; 主服务器&#xff08;master&#xff09;: 192.168.30.204&#xff0c;用yum安装的MySQL.&#xff08;内有多个库&#xff09; 从服…

转: ant condition使用

评注&#xff1a; 用c语言的方式来&#xff0c;比喻ant...比较好理解 转&#xff1a; http://www.smithfox.com/?e176 [备忘] Apache Ant中的逻辑判断 [原创链接: http://www.smithfox.com/?e176 转载请保留此声明, 谢谢!! ] 在写Ant时有时免不了要简单的逻辑, 本文并没有创造…