<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/context http://www.springframework.org/schema/aop "> <!-- 自动扫描 --> <context:component-scan base-package="com.aop"/> <!-- 使用AspjectJ自动生成代理对象 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
测试类AopTest类:
public class AopTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("aopContext.xml"); Hello hello = context.getBean(Hello.class); hello.hi(); } }
最后的输出结果为:
现在问题来了,各种通知的顺序是如何呢?其实从输出结果中也可以看出来。同一个类中的各种通知执行顺序是:
Around之前通知 >= Before通知 >= 目标方法执行 >= Around之后通知 >= After通知 >= AfterReturn通知
2.4 指定切面的优先级在同一个连接点上应用不止一个切面时, 除非明确指定, 否则它们的优先级是不确定的。切面的优先级可以通过实现 Ordered 接口或利用 @Order 注解指定。实现 Ordered 接口, getOrder() 方法的返回值越小, 优先级越高.若使用 @Order 注解, 序号出现在注解中。
@Aspect @Order(0) @Component public class HelloAspect2 { } @Aspect @Order(1) @Component public class HelloAspect { }
2.5 重用切入点定义