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方法

Spring源码解析-AOP简单分析

上面的before是有拦截器MethodBeforeAdviceInterceptor调用

Spring源码解析-AOP简单分析

再看AfterReturningAdvice接口实现类AspectJAfterReturningAdvice的afterReturning方法

Spring源码解析-AOP简单分析

上面的afterReturning是有拦截器`AfterReturningAdviceInterceptor`调用

Spring源码解析-AOP简单分析

在这里可能大家会有些疑问`MethodBeforeAdviceInterceptor`和`MethodBeforeAdviceInterceptor`中都存在`mi.proceed()`代码,会不会执行2次呢?
答案是不会,进行调式发现只有`AfterReturningAdviceInterceptor`中的proceed方法执行了saveOrder()方法,其实我们也可以通过Spring的命名来猜测,
`MethodBeforeAdviceInterceptor`方法执行前,所以不会执行目标方法。下面具体调试的过程。

before

Spring源码解析-AOP简单分析

after

Spring源码解析-AOP简单分析

Spring源码解析-AOP简单分析

Spring源码解析-AOP简单分析