我们先来模拟这种情况
我们先创建一个java项目 然后 引入Spring aop需要的基本依赖
然后 在src下创建一个包 我这里叫 Aop
在Aop包下创建一个类 叫 User
参考代码如下
package Aop;
import org.springframework.stereotype.Component;
@Component
public class User {
public void add(){
System.out.println("add......");
}
}
然后 Aop下创建两个增强类 第一个 我叫 UserProxy
参考代码如下
package Aop;
import org.springframework.stereotype.Component;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Component
@Aspect
public class UserProxy {
//拆分公共切入点
@Pointcut(value = "execution(* Aop.User.add(..))")
public void commonEntryPoint() {
}
//被增强方法执行前调用
@Before(value = "commonEntryPoint()")
public void before() {
System.out.println("UserProxy before...");
}
}
然后在Aop包下创建 第二个增强类 叫 secondaryEnhancement
参考代码如下
package Aop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class secondaryEnhancement {
//拆分公共切入点
@Pointcut(value = "execution(* Aop.User.add(..))")
public void commonEntryPoint() {
}
//被增强方法执行前调用
@Before(value = "commonEntryPoint()")
public void before() {
System.out.println("secondaryEnhancement before...");
}
}
此时 我们可以看到 secondaryEnhancement 和 UserProxy Before注解标注的增强方法 都指向了User中的add方法
然后 我们来写配置文件
在src目录下创建bean.xml
参考代码如下
<?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/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="Aop"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
此时 我们在配置文件中 打开了 Aop包的扫描
但为题说回来 secondaryEnhancement 和 UserProxy都增强了 add方法 那么他们谁先谁后 又怎么设置呢?
此时 带出我们第二个组件 Order
格式 @Order(值) 接受一个数字类型的值 值越小 优先级越高
然后 我们这样
修改UserProxy 代码如下
package Aop;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Component
@Aspect
@Order(1)
public class UserProxy {
//拆分公共切入点
@Pointcut(value = "execution(* Aop.User.add(..))")
public void commonEntryPoint() {
}
//被增强方法执行前调用
@Before(value = "commonEntryPoint()")
public void before() {
System.out.println("UserProxy before...");
}
}
修改 secondaryEnhancement 参考代码如下
package Aop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Component
@Aspect
@Order(2)
public class secondaryEnhancement {
//拆分公共切入点
@Pointcut(value = "execution(* Aop.User.add(..))")
public void commonEntryPoint() {
}
//被增强方法执行前调用
@Before(value = "commonEntryPoint()")
public void before() {
System.out.println("secondaryEnhancement before...");
}
}
这时 UserProxy 优先级 为 1 secondaryEnhancement 为2 显然 1小于2 所以UserProxy 优先级更高 会被先执行
我们在src下新建测试类 参考代码如下
import Aop.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class text {
public static void main(String args[]) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
User user = context.getBean("user", User.class);
user.add();
}
}
然后 我们运行测试类参考代码如下
可以看到 我们UserProxy 中的方法先执行了 然后 我们将两者优先级调换
运行结果如下
执行顺序也就反了过来 没有任何问题