切面的优先级
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/26bad79946ac286e6bc2946b59aaefce.png)
- 示例:
- 现在有四个java程序,
- CalcUtil:一个接口,定义了加减乘除的抽象方法
- IntCalc:接口的一个子类实现,实现了整形的方法实习
- LogAspect:一个AOP切面,负责在IntCalc类中执行任何方法时打印日志
- ValidateAspect:另一个AOP切面负责在IntCalc类中执行任何方法是印证参数是否为正数
- 此时IntCalc类中的方法同时应用了两处切面,要使ValidateAspect切面先执行
@Aspect
@Component
@Order(0)
public class ValidateAspect {
@Before("execution(* mao.shu.spring.aop.aspectJ.*(..))")
public void validate(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
for (Object a : args){
Integer temp = new Integer(String.valueOf(a));
if(temp < 0 ){
System.out.println( a + " 参数小于 0 请输入正整数");
}
}
}
}
@Aspect
@Component
@Order(1)
public class LogAspect {
package mao.shu.spring.aop.aspectJ;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import static org.junit.Assert.*;
public class IntCalcTest {
@Test
public void test() throws Exception {
ApplicationContext app = new ClassPathXmlApplicationContext("mao/shu/spring/aop/aspectJ/aspectJ.xml");
IntCalc intCalc = (IntCalc) app.getBean("intCalc");
System.out.println(intCalc.plus(-100, 678));
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/38665eb1cbd25384303d7897bff8c14e.png)
重用切入点定义
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d0d99029bc60c6b9a297c3f84e49614e.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a77501f5728eb8e1f306b0f25c310d6a.png)
- 示例:单独写一个类用于定义公共的切入点表达式
- PointcutUtil
public class PointcutUtil {
@Pointcut("execution(* mao.shu.spring.aop.aspectJ.IntCalc.*(..))")
public void pointcut(){}
}
@Before("PointcutUtil.pointcut()")
public void validate(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
for (Object a : args){
Integer temp = new Integer(String.valueOf(a));
if(temp < 0 ){
System.out.println( a + " 参数小于 0 请输入正整数");
}
}
}