Spring源码解析-AOP简单分析
2017-10-15 14:33
627 查看
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
相关文章推荐
- 【Spring源码分析】AOP源码解析(下篇)
- 【Spring源码分析】AOP源码解析(上篇)
- Spring源码分析:AOP源码解析(下篇)
- 【Spring源码分析】AOP源码解析(下篇)
- Spring源码分析:AOP源码解析(上篇)
- Spring源码分析:AOP源码解析(上篇)
- Spring源码分析:AOP源码解析(下篇)
- 【Spring源码分析】AOP源码解析(上篇)
- Spring源码解析之四 ------ AOP原理和源码分析
- spring源码分析-web容器初始化过程解析1
- Spring基于注解形式的 AOP的原理流程及源码解析(四)
- Spring AOP 源码分析 - 筛选合适的通知器
- Spring bean定义解析源码分析
- Spring 源码分析(三) —— AOP(一)AOP原理
- spring 源码探索 -- aop 标签解析和创建代理
- Spring Ioc 源码分析(一)- XML 解析
- Spring----AOP面向切面编程例子解析(附源码)
- Spring AOP源码分析(生成代理对象)
- spring-data-mongo 关于_id 字段解析源码分析
- Spring对注解(Annotation)处理源码分析2——解析和注入注解配置的资源