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