1 .
timeCountIntecetor implements handlerInterceptor { preHandle(); postHandle(); afterComplete(); }
2 . 动态代理 by implement InvocationHandler (对接口)
class MyProxy implements InvocationHandler { Object obj; public Object bind(Object obj) { this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj .getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("I'm proxy!"); Object res = method.invoke(obj, args); return res; } } public class DynamicProxy { public static void main(String[] args) { MyProxy myproxy = new MyProxy(); HoseeDynamicimpl dynamicimpl = new HoseeDynamicimpl(); HoseeDynamic proxy = (HoseeDynamic)myproxy.bind(dynamicimpl); System.out.println(proxy.sayhi()); } }
3 . 对类:
@Aspect
ServiceTimeCountAspect:
@Pointcut("execution(* me.ele.jarch.aries.service.*.*(..))") private void serviceMethod() { } // @Around("me.ele.jarch.aries.aspect.ServiceTimeCountAspect.serviceMethod()") // @Around("serviceMethod() || repositoryMethod()") @Around("serviceMethod()") public Object logServiceMethodRunningTime(ProceedingJoinPoint pjp) throws Throwable { // start stopwatch StopWatch watch = new StopWatch(); watch.start(); Object retVal = pjp.proceed(); // stop stopwatch watch.stop(); Long time = watch.getTotalTimeMillis(); String methodName = pjp.getSignature().getName(); logger.info("service method: {} time count : {}", methodName, time); return retVal; }
Spring AOP 会动态选择使用 JDK 动态代理、CGLIB 来生成 AOP 代理,如果目标类实现了接口,Spring AOP 则无需 CGLIB 的支持,直接使用 JDK 提供的 Proxy 和 InvocationHandler 来生成 AOP 代理即可。