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

最新文章

  1. h5和h4区别图片
  2. JavaSPI机制学习笔记
  3. 一般php创建的文件默认不是utf-8格式的,在网上搜罗的解决办法如下:
  4. WebUploader——一个页面多个实例上传图片
  5. SpringMVC04controller中定义多个方法
  6. 用timer控件实现sleep效果
  7. 页面样式base.css
  8. java泛型操作复习,以及讲解在android中使用的场景
  9. 201521123099 《Java程序设计》第11周学习总结
  10. java&python环境变量+idea&pycharm激活
  11. c# 如何读取web.config中的内容(ConfigurationManager)
  12. 细说@Html.ActionLink()的用法(转)
  13. React Native的学习资源网址
  14. svn与git操作对比 (未来有空做一个 svn与git实战对比 )
  15. C#:注册组件 (cmd)
  16. 单页面应用(SPA)重新部署后,正在浏览的页面如何更新缓存?
  17. .NET 中什么样的类是可使用 await 异步等待的?
  18. 【Codeforces】CF 8 C Looking for Order(状压dp)
  19. 那些年vue踩过的坑
  20. 【CF438E】小朋友和二叉树 解题报告

热门文章

  1. Hadoop(4)--Hbase
  2. 数据分析处理库Pandas——时间
  3. GDOI DAY1游记
  4. R语言学习笔记(一):mode, class, typeof的区别
  5. 「LibreOJ#516」DP 一般看规律
  6. [BZOJ2809][Apio2012]dispatching(左偏树)
  7. ALVのイベントを取得する方法
  8. Git的使用规范(二)
  9. Android开发——告诉你Adapter应该写在Activity里面还是外面
  10. ORB-SLAM(五)KeyFrame类