User
@Component
public class User {
public void add(){
// int a=1/0;
System.out.println("add....");
}
}
UserProxy
@Component
@Aspect
public class UserProxy {
@Before(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void before(){
System.out.println("before...");
}
@After(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void after(){
System.out.println("after...");
}
@AfterReturning(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void afterReturning(){
System.out.println("afterReturning...");
}
@AfterThrowing(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void afterThrowing(){
System.out.println("afterThrowing...");
}
@Around(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕之前...");
proceedingJoinPoint.proceed();
System.out.println("环绕之后...");
}
}
spring配置文件
<?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="com.atguigu.spring5.aopanno"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
测试方法
@Test
public void testAopAnno(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
User user = context.getBean("user", User.class);
user.add();
}
运行结果
在add方法中加入int a=1/0;
方法错误,afterReturning不执行;after一定执行。
总结
正常情况下执行顺序:Around start -> Before ->方法执行-> Around end -> After -> AfterReturning
有异常情况下执行顺序:Around start -> Before -> After -> AfterThrowing
优先级:有多个增强类对同一个方法进行增强
@Component
@Aspect
@Order(1)
public class PersonProxy {
@Pointcut(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void pointdemo(){
}
@Before(value = "pointdemo()")
public void before(){
System.out.println("before2...");
}
@After(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void after(){
System.out.println("after2...");
}
@AfterReturning(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void afterReturning(){
System.out.println("afterReturning2...");
}
@AfterThrowing(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void afterThrowing(){
System.out.println("afterThrowing2...");
}
@Around(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕之前2...");
proceedingJoinPoint.proceed();
System.out.println("环绕之后2..");
}
}
设置UserProxy -@Order(3)
结果