Spring源码解析-AOP简单分析
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等,不需要去修改业务相关的代码。
对于这部分内容,同样采用一个简单的例子和源码来说明。
接口
public interface OrderService { public void saveOrder(); }
实现类
public class OrderServiceImpl implements OrderService{ @Override public void saveOrder() { System.out.println("save order"); } }
日志通知
public class LogAdvice implements MethodBeforeAdvice,AfterReturningAdvice{ @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("after logging"); } @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("before logging"); } }
测试类
@Test public void testAop(){ ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setTarget(new OrderServiceImpl()); proxyFactory.addAdvice(new LogAdvice()); OrderService orderService = (OrderService) proxyFactory.getProxy(); orderService.saveOrder(); }
运行结果:
before logging
save order
after logging
源码分析:
先从MethodBeforeAdvice接口实现类AspectJMethodBeforeAdvice的before方法
上面的before是有拦截器MethodBeforeAdviceInterceptor调用
再看AfterReturningAdvice接口实现类AspectJAfterReturningAdvice的afterReturning方法
上面的afterReturning是有拦截器`AfterReturningAdviceInterceptor`调用
在这里可能大家会有些疑问`MethodBeforeAdviceInterceptor`和`MethodBeforeAdviceInterceptor`中都存在`mi.proceed()`代码,会不会执行2次呢?
答案是不会,进行调式发现只有`AfterReturningAdviceInterceptor`中的proceed方法执行了saveOrder()方法,其实我们也可以通过Spring的命名来猜测,
`MethodBeforeAdviceInterceptor`方法执行前,所以不会执行目标方法。下面具体调试的过程。
before
after