文章目录
Spring AOP 通知(一)
通知的五种类型
定义通知
@Aspect
public class AspectsTest {
//这里为通知:前置通知
@Before(...)
public void aopBeforeTest(){
//这里面编写的就是通知的内容
}
}
准备
目标方法的接口
public interface IAop {
void testAop();
}
目标接口的实现
@Component
public class AopImpl implements IAop {
public void testAop() {
System.out.println("invoke AopImpl testAop method");
//throw new NullPointerException();
}
}
定义切面
@Aspect
@Component
public class AopTest {
}
测试代码
public class Test {
private ApplicationContext ap;
{
ap = new AnnotationConfigApplicationContext(SpringConfig.class);
}
@Test
public void test01(){
IAop aopImpl = ap.getBean("aopImpl", AopImpl.class);
aopImpl.testAop();
}
}
前置通知:Before
在目标方法前调用
在切面中添加切点和通知
//@Before为前置通知
@Before("execution(* com.test.aop.IAop.testAop(..))")
public void aopBefore(){
System.out.println("invoke AopTest aopBefore method");
}
执行后的结果
后置通知:After
在目标方法后调用
继续在切面中添加后置通知
//@After为后置通知
@After("execution(* com.test.aop.IAop.testAop(..))")
public void aopAfter(){
System.out.println("invoke AopTest aopAfter medthod");
}
执行结果
返回通知:AfterReturning
在目标方法执行成功后执行
及目标方法无异常则执行该通知
继续在切面中添加返回通知
//@AfterReturning为返回通知
@AfterReturning("execution(* com.test.aop.IAop.testAop(..))")
public void aopAfterreturning(){
System.out.println("invoke AopTest aopAfterreturning medthod");
}
添加异常
//打开AopImpl中抛出的异常
throw new NullPointerException();
抛出异常后结果
关闭异常后执行结果
异常通知:AfterThrowing
在目标方法抛出异常后执行
继续在切面中添加异常通知
//@AfterThrowing为异常通知
@AfterThrowing("execution(* com.test.aop.IAop.testAop(..))")
public void aopAfterthrowing(){
System.out.println("invoke AopTest aopAfterthrowing medthod");
}
关闭异常后执行结果
打开异常后执行结果
环绕通知:Around
可以在目标方法执行前后自定义行为
环绕通知可以携带参数ProceedingJoinPoint
其proceed()方法用于调用目标方法
当不调用时可以控制对目标的访问
也可以多次调用来实现重试逻辑
继续在切面中添加返回通知
//@Around为环绕通知
@Around("execution(* com.test.aop.IAop.testAop(..))")
public void aopAround(ProceedingJoinPoint pj) throws Throwable {
System.out.println("invoke AopTest aopAround1 medthod");
//用于调用目标方法
pj.proceed();
System.out.println("invoke AopTest aopAround2 medthod");
}
当不调用时:关闭pj.proceed();调用
当的多次调用后
打开异常后执行结果
关闭异常后执行结果
注意
在测试中的异常情况反应出:返回通知
和环绕通知
会因异常的出现进而中断