三、通过 配置将 类->通知
基于Schema配置
类似 与 实现接口的方式
接口方式通知:public class LogAfter implements AfterReturningAdvice
Schema方式通知:
a.编写一个普通类 public class LogAfter {}
b.将该类 通过配置,转为一个“通知”
如果要获取目标对象信息:
注解、schema:JoinPoint
接口:Method method, Object[] args, Object target
schema形式 和注解形式相似,不同之处: 注解形式 使用了注册@After, schmema形式进行了多余的配置
LogSchema.java
package org.lanqiao.aop;
import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class LogSchema {
//后置通知方法 :JoinPoint适用于注解
public void afterReturning(JoinPoint jp,Object returnValue) throws Throwable {
System.out.println("》》》》》》》》》》》后置通知:目标对象:"+jp.getThis()+",调用的方法名:"+jp.getSignature().getName()+",方法的参数个数:"+jp.getArgs().length+",方法的返回值:"+returnValue);
}
public void before() {
System.out.println("》》》》》》》》》》》前置通知...");
}
public void whenException(JoinPoint jp,NullPointerException e) {
System.out.println(">>>>>>>>>>>>>>>>异常:" +e.getMessage());
}
//注意:环绕通知 会返回目标方法的返回值,因此返回值为Object
public Object around(ProceedingJoinPoint jp) {
System.out.println("''''''''''''''''''环绕通知:前置通知");
Object result = null ;
try {
result = jp.proceed() ;//执行方法
System.out.println("'''''''''"+jp.getSignature().getName()+","+result);
System.out.println("''''''''''''''''''环绕通知:后置通知");
}catch(Throwable e) {
System.out.println("''''''''''''''''''环绕通知:异常通知");
}
return result ;
}
}