老生常谈系列之Aop--前言
老生常谈系列之Aop--前言
前言
既然是前言,那么这一篇就不会写具体的技术问题。这篇文章主要记录我一些个人的思考以及为什么要写文章的缘由。前不久在跟朋友的交流中偶然聊到了Aop,Aop全称为 Aspect-oriented Programming ,翻译过来即为面向切面编程。这对大家来说这是个很眼熟的东西,对我来说亦如此。似乎从我们开始接触Java开始,这个概念一直就环绕在我们左右,照理说应该非常熟悉才对,但事实上就算项目有用到,也止于完成需求功能。即使是学习,也浅尝辄止,了解到Spring里的实现为动态代理还有其他一些切点切面的概念已经算是学得比较深了,但是始终没有去深究这个东西的来龙去脉,也没有了解过真正的原理,至少对我个人来说是这样的,一切都朦朦胧胧,也可能是由于我功力不足,没办法学透。
于是萌生了写一个简单的Aop系列文章发布在博客上,算是自己的学习记录和总结,如果能帮助到别人,那就更好了。冒出这个念头的一瞬间我是十分欣喜的,就像要开始一趟新的征程。但是稍后我就冷静下来,这一系列可不简单,细节相当多。如果只是作为我的笔记,那么就算错漏百出也只是荼毒我一人,但是如果别人看了误人子弟,那就不是我的初衷了。我怕我没有办法写清楚,更怕我会写错。最为忌讳的就是以己昏昏使人昭昭,到时候写成前言不搭后语恐怕要贻笑大方。也许我写的可能根本不会有人看,但是对质量的要求是我自身的准则。不清不楚、不明不白是万万不可的。
稍加思索之后,我觉得我应该放弃。但是打开了Spring Aop部分的源码之后,我看到了我一年前加的注释,顿时就觉得,我一定要写,无论写得是好是坏。因为一年前我就是怀揣着写系列文章的想法去看源码的,但是在后来,我放弃了。同样的理由,我怕我写不好,我怕我写不清楚,更怕会写错。
资料
所以我决定从头开始梳理,从AspectJ开始,再到Spring Aop。我搜了一下网上的文章,发现互相借鉴的情况很多鱼龙混杂,以至于会出现差不多的一篇文章内容,同时占据了Google搜索的前十。所以追根溯源,还是觉得看官方文档比较直接,于是我去看了AspectJ的官方文档,然后去看了Spring的官方文档Aop部分。同时阅读了部分Spring相关书籍,例如《Spring源码深度解析》、《Spring实战》、《Spring揭秘》以及《Spring5核心原理与30个类手写实战》等书籍的Aop部分。同时参考了许多大佬的博客,有很多非常好的博客,我觉得他们写得已经很好了。下面推荐一下大佬们的文章:
【必读】首先,推荐的是《Spring 源码深度解析》的 「第7章 AOP」 章节。
因为 Spring 静态 AOP 实际场景下,使用较少,可以选择性看看。感兴趣的话,可以对 Java Instrumentation 机制做一定的了解。目前主流的链路追踪系统的 Java Agent 都是基于它来实现的。
然后,也推荐看看五月的仓颉关于 AOP 的两篇文章:
- 《【Spring源码分析】AOP源码解析(上篇)》 ,对 Spring AOP XML 配置的方式进行源码解析。
- 《【Spring源码分析】AOP源码解析(下篇)》 ,内容上,和《Spring 源码深度解析》的「第7章 AOP」章节,作为互为补充。
再然后,也非常推荐田小波关于 AOP 的四篇文章,非常细致,特别是对 AOP 的概念解释以及流程的拆分上:
- 《Spring AOP 源码分析系列文章导读》
- 《Spring AOP 源码分析 - 筛选合适的通知器》
- 《Spring AOP 源码分析 - 创建代理对象》
- 《Spring AOP 源码分析 - 拦截器链的执行过程》
再再然后,还会非常推荐 JavaDoop 关于 AOP 的一篇文章,看着大气:
最后,推荐一些和 AOP 相关的有趣的文章:
目标
我觉得我的知识储备在他们面前没有任何的亮点,但是我还是打算自己写,也算是自娱自乐,或者是对自己的一种交代,跟着大佬们的指导,也许会少走很多弯路。这是一个开篇,也是自己立下的flag,希望我能按照自己的想法去写完这一系列的文章。下面说一下我的思路安排,首先我会介绍一下AspectJ的用法,纯AspectJ如何实现切面,接下来简单介绍一下AspectJ的原理,然后到Spring Aop是如何实现的,Spring Aop与AspectJ的关系,Spring Aop的源码解析,最后会列几个项目中使用Aop遇到的一些问题。所以列出来打标题大概如下:
- AspectJ简介、原理和用法
- Spring Aop简介和用法
- Spring Aop的源码解析(这一部分会分多篇)
- 项目里使用Aop的例子以及问题
有善始者实繁,能克终者盖寡。 flag立完了,接下来要好好实现了。如果有人阅读至此,与君共勉。路漫漫其修远兮,吾将上下而求索。