zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    List集合
    ArrayList_toArray
    Collection集合基础知识
    Array类的使用
    16.10
    16.9
    16.8
    16.7
    16.6
    16.5
  • 原文地址:https://www.cnblogs.com/lzeffort/p/7670998.html
Copyright © 2011-2022 走看看