专业手机网站建设公司,潍坊网站建设策划方案,成都房地产信息网,qq小程序官网比较分析 Spring AOP 和 AspectJ 之间的差别 英文原文#xff1a;Comparative Analysis Between Spring AOP and AspectJ 标签#xff1a; AspectJ Spring158人收藏此文章, 我要收藏oschina 推荐于 3年前 (共 7 段, 翻译完成于 10-24) (19评) 参与翻译(2人)#xff1a; bear…比较分析 Spring AOP 和 AspectJ 之间的差别 英文原文Comparative Analysis Between Spring AOP and AspectJ 标签 AspectJ Spring 158人收藏此文章, 我要收藏oschina 推荐于 3年前 (共 7 段, 翻译完成于 10-24) (19评) 参与翻译(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翻译于 3年前 3人顶 顶 翻译的不错哦! 在决定使用哪种框架实现你的项目之前有几个要点可以帮助你做出合适的选择同样适用于其他框架。 Spring AOP致力于提供一种能够与Spring IoC紧密集成的面向方面框架的实现以便于解决在开发企业级项目时面临的常见问题。明确你在应用横切关注点(cross-cutting concern)时例如事物管理、日志或性能评估需要处理的是Spring beans还是POJO。如果正在开发新的应用则选择Spring AOP就没有什么阻力。但是如果你正在维护一个现有的应用该应用并没有使用Spring框架AspectJ就将是一个自然的选择了。为了详细说明这一点假如你正在使用Spring AOP当你想将日志功能作为一个通知(advice)加入到你的应用中用于追踪程序流程那么该通知(Advice)就只能应用在Spring beans的连接点(Joinpoint)之上。 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 idmyServices classcom.ashutosh.MyServicesImpl / aop:config aop:aspect idloggingAspect reflogging aop:around methodlog pointcutexecution(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翻译于 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 idmyServices classcom.ashutosh.MyServicesImpl / aop:config aop:aspect idloggingAspect reflogging aop:around methodlog pointcutexecution(public * *(..))/ /aop:aspect /aop:config -- 如果你使用AspectJ想要做到同样的事情你也许就需要使用acjAspectJ编译器重新编译所有的代码并且进行重新打包。否则你也可以选择使用AspectJ编译后(post-compile)或载入时(load-time)织入。 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 idmyServices classcom.ashutosh.MyServicesImpl / //Java file public final classMyServicesImpl { --- } 在这种情况下你也许会考虑使用AspectJ其支持编译期织入且不需要生成代理。 于此相似在static和final方法上应用横切关注点也是无法做到的。因为Spring基于代理模式。如果你在这些方法上配置通知将导致运行时异常因为static和final方法是不能被覆盖的。在这种情况下你也会考虑使用AspectJ因为其支持编译期织入且不需要生成代理。 bearkidult翻译于 3年前 2人顶 顶 翻译的不错哦! 你一定希望使用一种易于实现的方式。因为Spring AOP支持注解在使用Aspect注解创建和配置方面时将更加方便。而使用AspectJ你就需要通过.aj文件来创建方面并且需要使用ajcAspect编译器来编译代码。所以如果你确定之前提到的限制不会成为你的项目的障碍时使用Spring AOP。 使用AspectJ的一个间接局限是因为AspectJ通知可以应用于POJO之上它有可能将通知应用于一个已配置的通知之上。对于一个你没有注意到这方面问题的大范围应用的通知这有可能导致一个无限循环。 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