在研究事務的時候發現事務的AOP類TransactionInterceptor是實現了接口MethodInterceptor,於是想着研究下這種AOP的實現方式。
1. 實現方式1如下
1.實現MethodInterceptor接口。(扮演Advice通知的角色)
簡單的實現方法執行前、執行后打印一下日志。
package cn.qlq.aop; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class MyInterceptor implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println(invocation.getMethod() + "==方法執行前=="); Object proceed = invocation.proceed(); System.out.println(invocation.getArguments() + "--方法執行后--"); return proceed; } }
其實MethodInterceptor接口繼承Interceptor、Interceptor接口繼承Advice接口。這些接口是org.aopalliance包下的(spring-aop包)
2.實現接口Pointcut(扮演切入點的角色)
根據類名稱、方法名稱判斷是否滿足指定的過濾條件。
package cn.qlq.aop; import java.lang.reflect.Method; import org.apache.commons.lang3.StringUtils; import org.springframework.aop.ClassFilter; import org.springframework.aop.MethodMatcher; import org.springframework.aop.Pointcut; public class MyPoint implements Pointcut { @Override public ClassFilter getClassFilter() { return new ClassFilter() { @Override public boolean matches(Class<?> clazz) { // 如果ServiceImpl就返回true if (clazz != null && StringUtils.contains(clazz.getName(), "cn.qlq.service")) { System.out.println("======MyPoint======getClassFilter "); System.out.println(clazz); return true; } return false; } }; } @Override public MethodMatcher getMethodMatcher() { return new MethodMatcher() { /** * 判斷方法是否匹配 */ @Override public boolean matches(Method method, Class<?> targetClass, Object... args) { System.out.println("matches=========1"); System.out.println(method); System.out.println(targetClass); System.out.println(args); return true; } /** * 判斷方法是否匹配 */ @Override public boolean matches(Method method, Class<?> targetClass) { System.out.println("matches=========2"); System.out.println(method); System.out.println(targetClass); return true; } @Override public boolean isRuntime() { return false; } }; } }
3.增加配置類實現PointcutAdvisor。注意要注入到spring容器中。(扮演切面Aspect的角色)
package cn.qlq.aop; import org.aopalliance.aop.Advice; import org.springframework.aop.Pointcut; import org.springframework.aop.PointcutAdvisor; import org.springframework.stereotype.Component; @Component public class MyAdvicer implements PointcutAdvisor { @Override public Advice getAdvice() { return new MyInterceptor(); } @Override public boolean isPerInstance() { return true; } @Override public Pointcut getPointcut() { return new MyPoint(); } }
2. 實現方式2如下:
增強類:
package cn.qlq.aop; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class MyInterceptor implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println(invocation.getMethod() + "==方法執行前=="); Object proceed = invocation.proceed(); System.out.println(invocation.getArguments() + "--方法執行后--"); return proceed; } }
配置類:
package cn.qlq.aop; import org.springframework.aop.aspectj.AspectJExpressionPointcut; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyInterceptorConfig { public static final String traceExecution = "execution(* cn.qlq.service..*.*(..))"; @Bean public DefaultPointcutAdvisor defaultPointcutAdvisor2() { AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); pointcut.setExpression(traceExecution); // 配置增強類advisor DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(); advisor.setPointcut(pointcut); MyInterceptor interceptor = new MyInterceptor(); advisor.setAdvice(interceptor); return advisor; } }
還有另一種方式就是自定義注解加@Aspect方式實現AOP。參考:https://www.cnblogs.com/qlqwjy/p/8729280.html