欢迎转载交流: http://www.cnblogs.com/shizhongtao/p/3476973.html

下面的文字来自官方文档的翻译,具体事例以后奉上。

Advisors

"advisors"这个概念来自Spring1.2对AOP的支持,在AspectJ中是没有等价的概念。 advisor就像一个小的自包含的切面,这个切面只有一个通知。 切面自身通过一个bean表示,并且必须实现一个通知接口。Advisors可以很好的利用AspectJ切入点表达式。

Spring 2.0 通过 <aop:advisor> 元素来支持advisor 概念。 你将会发现它大多数情况下会结合transactional advice使用,<aop:advisor>在Spring 2.0中有自己的命名空间。格式如下:

 <aop:config>
<aop:pointcut id="businessService"
expression="execution(* com.xyz.myapp.service.*.*(..))"/> <aop:advisor
pointcut-ref="businessService"
advice-ref="tx-advice"/>
</aop:config> <tx:advice id="tx-advice">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

就想使用 pointcut-ref 属性一样,你还可以使用 pointcut 属性来定义一个内联的切入点表达式。

你可以使用order属性来定义advice的先后顺序。

示例

让我们来看看在 Section 9.2.7, “Example”提过并发锁失败重试的例子,使用schema进行重写是什么效果。

由于并发问题(例如:死锁失败),业务逻辑服务层(business services)有时候会执行失败。 如果重新尝试一下,他下次执行可能就会成功。对于business services来说,失败后重试是很正常的(Idempotent操作不需要用户参与,否则会得出矛盾的结论) 我们可能需要透明的重试操作以避免让客户看见 PessimisticLockingFailureException 例外被抛出。 这就要求在一个跨域多各服务层进行操作,因此通过切面编程是很理想的实现。

因为我们想要进行重试操作,我们会需要使用到around advice,这样我们就可以多次调用proceed()方法来实现重试操作。 下面是简单的切面实现(一个schema支持的普通Java 类):

public class ConcurrentOperationExecutor implements Ordered {

   private static final int DEFAULT_MAX_RETRIES = 2;

   private int maxRetries = DEFAULT_MAX_RETRIES;
private int order = 1; public void setMaxRetries(int maxRetries) {
this.maxRetries = maxRetries;
} public int getOrder() {
return this.order;
} public void setOrder(int order) {
this.order = order;
} public Object doConcurrentOperation(ProceedingJoinPoint pjp) throws Throwable {
int numAttempts = 0;
PessimisticLockingFailureException lockFailureException;
do {
numAttempts++;
try {
return pjp.proceed();
}
catch(PessimisticLockingFailureException ex) {
lockFailureException = ex;
}
}
while(numAttempts <= this.maxRetries);
throw lockFailureException;
} }

请注意上面的切面类实现了 Ordered 接口,这样我们就可以把切面的优先级设定为高于事务通知(我们每次重试的时候都想要在一个新的事务中进行)。 maxRetriesorder 属性都在Spring中配置。主要实现过程发生在当(around advice) doConcurrentOperation方法调用的时候。 请注意这个时候我们所有的 businessService() 方法都会使用这个重试策略。 我们会尝试执行时,如果我们得到一个 PessimisticLockingFailureException 异常,程序就会帮助我们简单的重试,直到耗尽所有预设的重试次数。

除了没有使用注解(annotation),这个类与我们使用@AspectJ 时候是一样的。

对应的spring配置如下:

 <aop:config>

   <aop:aspect id="concurrentOperationRetry" ref="concurrentOperationExecutor">

     <aop:pointcut id="idempotentOperation"
expression="execution(* com.xyz.myapp.service.*.*(..))"/> <aop:around
pointcut-ref="idempotentOperation"
method="doConcurrentOperation"/> </aop:aspect> </aop:config> <bean id="concurrentOperationExecutor"
class="com.xyz.myapp.service.impl.ConcurrentOperationExecutor">
<property name="maxRetries" value="3"/>
<property name="order" value="100"/>
</bean>

请注意我们现在假设所有的业务操作都是idempotent。如果不是这样,我们可以改写切面方法,加上 Idempotent 注解,让它只调用idempotent:

@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {
// marker annotation
}

对于使用annotation方式对service操作进行注解。这样你希望改变切面使得idempotent的操作会尝试多次,你只需要改写切入点表达式来使 @Idempotent 操作匹配:

 <aop:pointcut id="idempotentOperation"
expression="execution(* com.xyz.myapp.service.*.*(..)) and
@annotation(com.xyz.myapp.service.Idempotent)"/>

9.4选择AOP声明风格的

当你确定切面是实现一个给定需求的最佳方法时,那么如何选择是使用Spring AOP还是AspectJ,以及确定使用Aspect语言(代码)风格还是@AspectJ声明风格又或者spring XML风格?这个决定会受到多个因素的影响,比如应用的需求、 开发工具和小组对AOP的熟练程度。

9.4.1 Spring AOP还是完全用AspectJ?

用最简单的步骤来工作。Spring AOP比完全使用AspectJ更加简单,因为它不需要引入AspectJ的编译器到你开发和构建过程中。 如果你只需要在Spring bean上进行操作,那么Spring AOP是合适的选择。如果你需要advice 的对象没有交给spring容器管理,那么你需要使用AspectJ。如果你想advice简单的方法执行之外的连接点(如:字段get或set的连接点等等), 也需要使用AspectJ。

当使用AspectJ时,你可以选择使用AspectJ语法(也称为“代码风格”)或@AspectJ注解风格。需要指出的是,如果你没有使用Java 5+,你就必须选择使用Aspectj语法了。 如果切面在你的设计中扮演一个很重要(或者比例很大)的角色,那么你就可以在Eclipse中使用AspectJ Development Tools (AJDT)插件;或者在你的应用中只有很少的切面编程,你或许应该考虑使用@AspectJ风格,并且在你的构建脚本中增加切面编译的部分。

9.4.2 Spring AOP中使用@AspectJ还是XML?

如果你使用Spring AOP,那么你可以选择@AspectJ或者XML风格。总的来说,如果你使用Java 5+, 建议使用@AspectJ风格。如果你不是运行在Java 5上,XML风格是最佳选择。

XML风格对现有的Spring用户来说更加习惯。它可以使用在任何JDK版本中(参考pointcut表达式内部的命名连接点,虽然它也需要Java 5+) 并且通过纯粹的POJO来支持。当使用AOP作为工具来配置企业服务时(一个好的例子是,你可能想单独更改pointcut表达式,不管她是不是你配置的一部分)XML会是一个很好的选择。对于XML风格,从你的配置中可以清晰的表明在系统中存在那些切面。

XML风格有两个缺点。第一是它不能完全将需求实现的地方封装到一个位置。DRY原则中说系统中的每一项知识都必须具有单一、无歧义、权威的表示。 当使用XML风格时,如何实现一个需求被分割到支撑类的声明中以及XML配置文件中。当使用@AspectJ风格时就只有一个单独的模块 -切面- 信息被封装了起来。 第二是XML风格同@AspectJ风格所能表达的内容相比有更多的限制:仅仅支持单例模式的切面实例模型,并且不能在XML中组合命名连接点的声明。 例如,在@AspectJ风格中我们可以编写这样的内容:

  @Pointcut(execution(* get*()))
public void propertyAccess() {} @Pointcut(execution(org.xyz.Account+ *(..))
public void operationReturningAnAccount() {} @Pointcut(propertyAccess() && operationReturningAnAccount())
public void accountPropertyAccess() {}

在xml风格中,我能声明开始的两个连接点,

 <aop:pointcut id="propertyAccess"
expression="execution(* get*())"/> <aop:pointcut id="operationReturningAnAccount"
expression="execution(org.xyz.Account+ *(..))"/>

但你不能通过组合来实现"accountPropertyAccess"的pointcut申明。
@AspectJ风格支持附加的实例模型以及更丰富的连接点组合。它具有将将切面保持为一个模块单元的优点。
还有一个优点就是Spring AOP和AspectJ两者都支持@AspectJ切面风格, 所以如果稍后你认为你需要AspectJ
的能力去实现附加的需求,那么你非常容易将spring aop转换成基于AspectJ的项目。总而言之,spring团队更喜欢@AspectJ风格只要你有切面
去做超出简单的“配置”企业服务之外的事情。

9.5混合切面类型

……

spring aop配置文档部分翻译的更多相关文章

  1. Spring Hibernate4 整合配置文档

    1 applicationContext.xml配置文档 <?xml version="1.0" encoding="UTF-8"?><bea ...

  2. Spring AOP配置方式

    AOP 面向切面编程,允许在 java 应用中的方法调用的前后做一些处理. 本文通过实例介绍两种主要的Spring AOP 配置方式:xml 方式配置,注解方式配置 XML 方式配置 1. 项目包类结 ...

  3. 关于Spring配置文件xml文档的schema约束

    最开始使用spring框架的时候,对于其配置文件xml,只是网上得知其使用方法,而不明其意.最近想着寻根问底的探究一下.以下是本文主要内容: 1.配置文件示例. <?xml version=&q ...

  4. Spring中xml文档的schema约束

    最开始使用Spring框架的时候,对于其配置文件xml,只是网上得知其使用方法,而不明其意.最近想着寻根问底的探究一下.以下是本文主要内容: 1.配置文件示例.   <?xml version= ...

  5. Java日志框架-Logback手册中文版以及官方配置文档教程

    Logback手册中文版:(链接: https://pan.baidu.com/s/1bpMyasR 密码: 6u5c),虽然版本有点旧,但是大体意思差不多,先用中文版了解个大概,然后一切最新的配置以 ...

  6. 集成 Spring Doc 接口文档和 knife4j-SpringBoot 2.7.2 实战基础

    优雅哥 SpringBoot 2.7.2 实战基础 - 04 -集成 Spring Doc 接口文档和 knife4j 前面已经集成 MyBatis Plus.Druid 数据源,开发了 5 个接口. ...

  7. MYSQL服务器my.cnf配置文档详解

    MYSQL服务器my.cnf配置文档详解 硬件:内存16G [client] port = 3306 socket = /data/3306/mysql.sock [mysql] no-auto-re ...

  8. 转!!Java代码规范、格式化和checkstyle检查配置文档

    为便于规范各位开发人员代码.提高代码质量,研发中心需要启动代码评审机制.为了加快代码评审的速度,减少不必要的时间,可以加入一些代码评审的静态检查工具,另外需要为研发中心配置统一的编码模板和代码格式化模 ...

  9. Hibernate配置文档详解

    Hibernate配置文档有框架总部署文档hibernate.cfg.xml 和映射类的配置文档 ***.hbm.xml hibernate.cfg.xml(文件位置直接放在src源文件夹即可) (在 ...

随机推荐

  1. 【原创】测试不同浏览器播放canvas动画的平滑程度

    Canvas无疑是HTML5开放式网络平台最激动人心的技术之一.目前,除了IE8以外,各类浏览器的新版本都支持HTML5 Canvas. 程序员需要通过Javascript调用Canvas API.基 ...

  2. IT人才什么最重要

    做人最重要 做人最主要的一条就是尊重别人 不尊重别人,一般都是产生于自己认为自己别别人强,认为别人总是犯一些非常二的错误,于是就不自觉的通过言语.表情.反应等一些细节流露出来 这种人时间长了就会没人愿 ...

  3. 05.pathinfo的两种模式与模版和控制器之间的关系

    <?php function dump($data){ echo '<pre>'; var_dump($data); echo '</pre>'; } dump($_SE ...

  4. 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明

    将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...

  5. iOS开发——新特性篇&swift新特性(__nullable和__nonnull)

    swift新特性(__nullable和__nonnull) 最近在看老师写代码的时候经常遇到两个陌生的关键字,但是当我在我的电脑上敲得时候就是敲不出,后来才知道这是为了swift与OC混编的时候产生 ...

  6. JAVA static 作用

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...

  7. android151 笔记 3

    34. 对android虚拟机的理解,包括内存管理机制垃圾回收机制. 虚拟机很小,空间很小,谈谈移动设备的虚拟机的大小限制 16M , 谈谈加载图片的时候怎么处理大图片的,压缩. 垃圾回收,没有引用的 ...

  8. LVS 之 DR 2

    http://www.cnblogs.com/kgdxpr/archive/2013/09/09/3309776.html http://lyp0909.blog.51cto.com/508999/5 ...

  9. SQL Server 数学函数 相关

      1.计算绝对值ABS ABS函数对一个数值表达式结果计算绝对值(bit数据类型除外),返回整数. 语法结构: ABS(数值表达式) 返回值:与数值表达式类型一致的数据 示例: SELECT ABS ...

  10. centos、linux改变ll命令显示颜色

    服务器用的centOS,用putty管理时,在命令行下目录用蓝色显示,很难看清.可以用以下两种方法改变: 方法一: 1.直接修改个人帐户目录下的.color.rc文件. 找到 DIR 01;34,修改 ...