当对于同一个方法加上多个相同类型的通知,如何确定这些不同通知的优先级
使用@Order注解指定优先级,值越小优先级越高
配置xml文件
<context:component-scan base-package="spring.aop.aop"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
建立两个不同类中对同一方法建立前置通知
LoggingAspect.java
@Order(2)
@Aspect
@Component
public class LoggingAspect {
@Before("execution (* spring.aop.aop.ArithmeticCalculatorImpl.*(..)) ")
public void beforeMethod(JoinPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
List<Object> args = Arrays.asList(joinPoint.getArgs());
System.out.println("The LoggingAspect "+methodName+" begins with "+args);
}
}
ViberAspect.java
@Order(1)
@Aspect
@Component
public class ViberAspect {
@Before("execution (* spring.aop.aop.ArithmeticCalculatorImpl.*(..)) ")
public void beforeMethod(JoinPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
List<Object> args = Arrays.asList(joinPoint.getArgs());
System.out.println("--> The ViberAspect "+methodName+" begins with "+args);
}
}
主函数
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("spring-aop.xml");
ArithmeticCalculator arithmeticCalculator = (ArithmeticCalculator) applicationContext.getBean("ArithmeticCalculatorImpl");
System.out.println("result: "+arithmeticCalculator.add(1,7));
}
运行结果