1. 目标方法类,spring代理bean
@Component
public class Test {public void test(){System.out.println("test 目标方法");}public void testException(){throw new RuntimeException();}
}
2. 配置类
@Configuration
@ComponentScan
@EnableAspectJAutoProxy //启用apsectJ的自动代理
public class Config {
}
3. 切面类
对测试类Test中的test()和testException()方法分别进行测试,并输出,以观察增强方法的执行顺序。
@Aspect //切面类
@Component
public class AspectOrder {@Pointcut("execution(* org.example.test.*.test*(..))")//表示匹配test包下的所有类的test*方法private void a() {}@Before("a()")//before(切入点表达式)public void before() {System.out.println("before");}@Around("a()")public Object doAround(ProceedingJoinPoint joinPoint) {System.out.println("Around 开始。。。");//运行目标方法Object proceed = null;try {proceed = joinPoint.proceed();} catch (Throwable e) {throw new RuntimeException(e);}System.out.println("Around 结束。。。");return proceed;}@AfterThrowing(throwing = "e", pointcut = "a()")public void doAfterThrowing(RuntimeException e) {System.out.println("出现异常:" + e.getMessage());}@AfterReturning(value = "a()",returning = "retVal") //正常返回执行 returning = "retVal"为返回值public void doAfterReturning(Object retVal) {System.out.println("AfterReturning");}@After("a()")public void doAfter() {System.out.println("after");}
}
4. 测试类
测试aop五种增强方法执行顺序。
public class Main {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);Test test = (Test) context.getBean("test");
// test.test();//无异常test.testException();//有异常}
}
5. 测试结果
1. 无异常时,各增强方法执行结果
2. 有异常时,各增强方法执行结果
6. 结论
1. 无异常时,执行顺序为:环绕增强(前)-> 前置增强 -> 目标方法 -> 返回增强 -> 后置增强 -> 环绕增强(后)
2. 有异常时,执行顺序为:环绕增强(前)-> 前置增强 -> 目标方法 -> 异常增强 -> 后置增强 。
有待补充....