问题描述

如果在Spring的程序中同时定义了环绕通知(Around)前置通知(Before)。.那么,有以下问题:
1.怎么让两个切面通知都起作用
2.或者让两者切面按自己指定的顺序进行执行?
3.环绕通知和前置后置通知的区别

引用知乎上的回答

如果在同一接入点(join point) 有多个通知(advice),Spring AOP 采用和 AspectJ 类似的优先级来指定通知的执行顺序,目标执行前(进入时),优先级高的通知先执行,目标执行后(出来时),优先级高的通知后执行。

如果两个通知分别定义在各自的 Aspect 内,可以通过如下两种方式控制 Aspect 的施加顺序:
Aspect 类添加注解:org.springframework.core.annotation.Order
顺序值:使用注解属性指定
Aspect 类实现接口:org.springframework.core.Ordered
顺序值:实现 Ordered 接口的 getOrder() 方法即可
如果两个 advice 位于同一 aspect 内,且执行顺序有先后,通过 advice 的声明顺序是无法确定其执行顺序的,因为 advice 方法的声明顺序无法通过反射获取,只能采取如下变通方式,二选一:
将两个 advice 合并为一个 advice,那么执行顺序就可以通过代码控制了
将两个 advice 分别抽离到各自的 aspect 内,然后为 aspect 指定执行顺序
作者:Night Silent
链接:http://www.zhihu.com/question/32326290/answer/55572235
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

问题回答

1. 怎么让两个切面通知都起作用

将需要被执行的通知的实现类,在Sping中进行注册或者全部采用注解的方式和配置扫描包
如果编写的环绕通知和前置后置通知没有问题,那么,通知就可以在切点出被调用。

<bean id="aroundAudience"class="com.springinaction.springidol.AroundAudience">
</bean>
<bean id="audience" class="com.springinaction.springidol.Audience" />

2. 或者让两者切面按自己指定的顺序进行执行?

你在Spring的配置文件中声明环绕通知和前置后置通知的顺序就是他们执行的先后顺序。由配置顺序决定执行先后顺序,本身没有优先级。

3.环绕通知和前置后置通知的区别

参考文档文档
下面的地址是Spring官方给出的AOP切面的文档

http://docs.spring.io/spring/docs/2.5.x/reference/aop.html#aop-ataspectj-advice-ordering
使用Spring进行面向切面编程(AOP).
http://www.blogjava.net/supercrsky/articles/174368.html
跟我学SPring3.x之切面执行顺序
http://jinnianshilongnian.iteye.com/blog/1423489


下面用一个实例来说明如何执行多个通知,实例采用Maven进行依赖管理,通知采用注解形式的配置

先上Spring的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--<start id="preamble" />-->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">
<!--<end id="preamble" />--><bean id="eddie"class="com.springinaction.springidol.Instrumentalist"><property name="instrument"><bean class="com.springinaction.springidol.Guitar" /></property></bean>
<bean id="aroundAudience"class="com.springinaction.springidol.AroundAudience"></bean><!--<start id="audience_bean" />--> <bean id="audience" class="com.springinaction.springidol.Audience" /><!--<end id="audience_bean" />--><!--<start id="contestant_introducer" />--> <bean class="com.springinaction.springidol.ContestantIntroducer" /><!--<end id="contestant_introducer" />--><!--<start id="aspectj_autoproxy" />--> <aop:aspectj-autoproxy /><!--<end id="aspectj_autoproxy" />--></beans>

Instrument接口

package com.springinaction.springidol;public interface Instrument {public void play();
}

Instrument实现类

package com.springinaction.springidol;public class Guitar implements Instrument {public void play() {System.out.println("Strum strum strum");}
}

AroundAudience类(定义环绕通知的类)

package com.springinaction.springidol;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;@Aspect
public class AroundAudience {@Pointcut("execution(* com.springinaction.springidol.Performer.perform(..))")public void performance() {}//<start id="audience_around_bean" /> @Around("performance()")public void watchPerformance(ProceedingJoinPoint joinpoint) {try {System.out.println("The audience is taking their seats.");System.out.println("The audience is turning off their cellphones");long start = System.currentTimeMillis();joinpoint.proceed();long end = System.currentTimeMillis();System.out.println("CLAP CLAP CLAP CLAP CLAP");System.out.println("The performance took " + (end - start)+ " milliseconds.");} catch (Throwable t) {System.out.println("Boo! We want our money back!");}}//<end id="audience_around_bean" />
}

Audience定义前置通知

package com.springinaction.springidol;import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;@Aspect
public class Audience {@Pointcut("execution(* com.springinaction.springidol.Performer.perform(..))")public void performance() { //<co id="co_definePointcut"/>System.out.println("fuck fuck fuck me ");}@Before("performance()")public void takeSeats() { //<co id="co_takeSeatsBefore"/>System.out.println("2222The audience is taking their seats.");}@Before("performance()")public void turnOffCellPhones() { //<co id="co_turnOffCellPhonesBefore"/>System.out.println("The audience is turning off their cellphones");}@AfterReturning("performance()")public void applaud() { //<co id="co_applaudAfter"/>System.out.println("CLAP CLAP CLAP CLAP CLAP");}@AfterThrowing("performance()")public void demandRefund() { //<co id="co_demandRefundAfterException"/>System.out.println("Boo! We want our money back!");}
}

Performer(被织入实现类的接口)

package com.springinaction.springidol;public interface Performer {void perform() throws PerformanceException;
}

PerformanceException

package com.springinaction.springidol;public class PerformanceException extends Exception {private static final long serialVersionUID = 1L;}

Instrumentalist(被织入实现类的接口)

package com.springinaction.springidol;public class Instrumentalist implements Performer {public void perform() throws PerformanceException {instrument.play();}private Instrument instrument;public void setInstrument(Instrument instrument) {this.instrument = instrument;}public Instrument getInstrument() {return instrument;}
}

测试类

package com.springinaction.springidol;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("spring-idol.xml")
public class AspectTest {@AutowiredApplicationContext context;@Testpublic void audienceShouldApplaud() throws Exception {Performer eddie = (Performer) context.getBean("eddie");eddie.perform();}@Testpublic void eddieShouldBeAContestant() {Contestant eddie = (Contestant) context.getBean("eddie");eddie.receiveAward();}
}

Maven的依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.frank</groupId><artifactId>springinaction</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>springinaction Maven Webapp</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><springversion>3.1.1.RELEASE</springversion><junitversion>3.8.1</junitversion></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-asm</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${springversion}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.2</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.2</version><scope>runtime</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.1</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version><scope>test</scope></dependency></dependencies>
</project>

运行的结果

Spring切面通知执行的顺序(Advice Order)相关推荐

  1. spring 切面通知执行过程

  2. 不同情况通知执行的顺序

    1.service方法有返回值 + 无异常 + XML *************************************** 1.前置通知...deleteUser 2.环绕通知...开启事 ...

  3. 第14章-Spring AOP通知(Advice)详解

    文章目录 一.概述 二.通知的定义 1. 前置通知 2. 后置通知 3. 环绕通知 4. 最终通知 5. 异常通知 三.通知的参数 1. 切入点 2. 通知的参数传递 四.通知的顺序 五.附录 1. ...

  4. 你真的确定Spring AOP的执行顺序吗

    本文内容重点: 问题描述 Spring AOP执行顺序 探究顺序错误的真相 代码验证 结论   问题描述 公司新项目需要搭建一个新的前后分离HTTP服务,我选择了目前比较熟悉的SpringBoot W ...

  5. 顺序执行_执行流程 | 你真的了解Spring AOP的执行顺序吗?

    Hi! 我是小小,我们又见面了,今天的主要内容是,你真的了解Spring AOP的执行顺序吗?跟随着我的脚步,一块丈量世界,了解世界,重新认识,重新了解Spring AOP的执行顺序. 聊一聊毕业四个 ...

  6. gtw-050090|执行拦截器时发生异常_执行流程 | 你真的了解Spring AOP的执行顺序吗?...

    Hi! 我是小小,我们又见面了,今天的主要内容是,你真的了解Spring AOP的执行顺序吗?跟随着我的脚步,一块丈量世界,了解世界,重新认识,重新了解Spring AOP的执行顺序. 聊一聊毕业四个 ...

  7. 执行流程 | 你真的了解Spring AOP的执行顺序吗?

    Hi! 我是小小,我们又见面了,今天的主要内容是,你真的了解Spring AOP的执行顺序吗?跟随着我的脚步,一块丈量世界,了解世界,重新认识,重新了解Spring AOP的执行顺序. 聊一聊毕业四个 ...

  8. Spring AOP通知实例 – Advice

    Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...

  9. Oracle数据库:排序order by语句,select from where order by的执行先后顺序,各种样例

    Oracle数据库:排序order by语句,select from where order by的执行先后顺序,各种样例 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多 ...

最新文章

  1. 50个photoshop网页设计教程-整体布局篇
  2. Scala中心基金会成立
  3. java poi excel无法添加水印替代方法
  4. python优雅代码大全_代码这样写更优雅(Python版)
  5. python需要的环境_python运行环境是什么
  6. latex中怎样写上标_LaTex:参考文献引用的方法
  7. Vue第二部分(1):组件基础学习
  8. javascript-索引1908
  9. Python安装jieba库
  10. 时间搓转换剩余时间 php
  11. java中高级面试_中高级面试常问:Java面向对象设计的六大原则
  12. 最简单最适合纯小白的postman使用方法(测试接口的不二利器)(从介绍到下载到使用的详细教程)
  13. 雄厚实力的企业支持,是拍账王品牌前进发展的根基
  14. 定风波·三月七日沙湖道中遇雨
  15. 三大流行BI分析平台推荐,企业数据化选择工具
  16. 量子计算机治愈癌症,如果量子计算机实现了,癌症可以治愈吗?
  17. 《Python黑帽子:黑客与渗透测试编程之道》读书笔记(三):scapy——网络的掌控者
  18. 一个并不“艰难”的决定—一个程序员的成长史(3)
  19. 质量员考试建筑八大员考试给排水工程遵循的原则和质量监管措施
  20. 图纸转图片cad转换成jpg格式

热门文章

  1. 题目描述 假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待
  2. ORACLE如何学习
  3. 故障申报系统php源码,seay源代码全自动在线审计系统,PHP源代码缺陷自动审计平台-在线工具...
  4. 计算机工程陶瓷,捏陶瓷之形,赏中华之美
  5. web前端|品优购|html+css|代码
  6. 转 影像质量评估之锐利度--MTF(SFR)
  7. 投身自媒体的普通人:他们是如何从从月入30到月入3万的
  8. 关于Pycharm第三方安装失败问题解决方法
  9. JS sort函数(按照首字母字符排序)
  10. CODE[VS] 1219 骑士游历