Browse Source

1、切面after切点,将目标方法执行返回值,开放给切点
2、SimpleAspect没有直接使用的意义,应修改为抽象类
3、修改Aspect#afterException 没有使用返回值进行异常是否抛出的判断。
4、修改CglibInterceptor#intercept 和 JdkInterceptor#intercept 方法中 if else 为 if ,减少else判断,并支持 第3点的修改

刘羽铖 6 years ago
parent
commit
22a51ba86d

+ 5 - 1
hutool-aop/src/main/java/cn/hutool/aop/aspects/Aspect.java

@@ -23,7 +23,11 @@ public interface Aspect{
 
 	/**
 	 * 目标方法执行后的操作
-	 * 
+	 * 如果 target.method 抛出异常且
+	 * @see Aspect#afterException 返回true,则不会执行此操作
+	 * 如果
+	 * @see Aspect#afterException 返回false,则无论target.method是否抛出异常,均会执行此操作
+	 *
 	 * @param target 目标对象
 	 * @param method 目标方法
 	 * @param args 参数

+ 12 - 0
hutool-aop/src/main/java/cn/hutool/aop/aspects/SimpleAspect.java

@@ -14,18 +14,30 @@ import java.lang.reflect.Method;
 public abstract class SimpleAspect implements Aspect, Serializable{
 	private static final long serialVersionUID = 1L;
 
+    /**
+     * @see Aspect#before(Object, Method, Object[])
+     * @return 是否继续执行接下来的操作 默认值true
+     */
 	@Override
 	public boolean before(Object target, Method method, Object[] args) {
 		//继承此类后实现此方法
 		return true;
 	}
 
+    /**
+     * @see Aspect#after(Object, Method, Object[], Object)
+     * @return 是否允许返回值(接下来的操作) 默认值true
+     */
 	@Override
 	public boolean after(Object target, Method method, Object[] args, Object returnVal) {
 		//继承此类后实现此方法
 		return true;
 	}
 
+    /**
+     * @see Aspect#afterException(Object, Method, Object[], Throwable)
+     * @return 是否允许抛出异常 默认值true
+     */
 	@Override
 	public boolean afterException(Object target, Method method, Object[] args, Throwable e) {
 		//继承此类后实现此方法

+ 7 - 4
hutool-aop/src/main/java/cn/hutool/aop/interceptor/CglibInterceptor.java

@@ -46,11 +46,14 @@ public class CglibInterceptor implements MethodInterceptor, Serializable {
 				result = proxy.invokeSuper(obj, args);
 			} catch (UtilException e) {
 				final Throwable cause = e.getCause();
-				if (e.getCause() instanceof InvocationTargetException) {
-					aspect.afterException(target, method, args, ((InvocationTargetException) cause).getTargetException());
-				} else {
-					throw e;// 其它异常属于代理的异常,直接抛出
+				if (!(e.getCause() instanceof InvocationTargetException)) {
+					// 其它异常属于代理的异常,直接抛出
+					throw e;
 				}
+				if(aspect.afterException(target, method, args, ((InvocationTargetException) cause).getTargetException())){
+					throw e;
+				}
+
 			}
 		}
 		if (aspect.after(target, method, args, result)) {

+ 6 - 4
hutool-aop/src/main/java/cn/hutool/aop/interceptor/JdkInterceptor.java

@@ -47,10 +47,12 @@ public class JdkInterceptor implements InvocationHandler, Serializable{
 				result = ReflectUtil.invoke(target, method, args);
 			} catch (UtilException e) {
 				final Throwable cause = e.getCause();
-				if (e.getCause() instanceof InvocationTargetException) {
-					aspect.afterException(target, method, args, ((InvocationTargetException) cause).getTargetException());
-				} else {
-					throw e;// 其它异常属于代理的异常,直接抛出
+				if (!(e.getCause() instanceof InvocationTargetException)) {
+					// 其它异常属于代理的异常,直接抛出
+					throw e;
+				}
+				if(aspect.afterException(target, method, args, ((InvocationTargetException) cause).getTargetException())){
+					throw e;
 				}
 			}
 		}