从源码入手,一文带你读懂Spring AOP面向切面编程

之前《零基础带你看Spring源码——IOC控制反转》详细讲了Spring容器的初始化和加载的原理,后面《你真的完全了解Java动态代理吗?看这篇就够了》介绍了下JDK的动态代理 。
基于这两者的实现上,这次来探索下Spring的AOP原理 。虽然AOP是基于Spring容器和动态代理,但不了解这两者原理也丝毫不影响理解AOP的原理实现,因为大家起码都会用 。
AOP,Aspect Oriented Programming,面向切面编程 。在很多时候我们写一些功能的时候,不需要用到继承这么重的方法,例如对每个方法在执行前打log,在没有AOP的情况下,我们只能对每个方法都写一句打log的语句 。如果是一个复杂点的功能,那么将会产生许多重复的代码,而且会对模块之间有更多的耦合 。然而,在AOP下,我们只需要通过特定的方法,就能直接切入代码,添加自定义的功能(后续再讲AOP里面的概念点) 。
下面将从一个简单的示例入手,拆解示例的内容,通过源码分析,一步步带大家读懂AOP的原理实现 。
【从源码入手,一文带你读懂Spring AOP面向切面编程】使用示例
以下代码不以文字形式展示,若需要代码,可以到github查看完整Demo 。Demo:
Spring项目依然是用xml最原始的配置方式,为了只是能简单地阅读原理,否则会多很多自动配置的内容在里面 。而AOP的配置用的是注解形式,因为毕竟看起来毕竟清晰,容易理解逻辑 。
创建一个Gradle项目,添加对应的Spring与AOP的依赖 。(Gradle和Maven类似,都是自动化构建的工具 。但与Maven相比,Gradle是基于groovy,采用DSL格式,具有更强的灵活性、简洁性、拓展性 。现在连Spring的官方源码都是用Gradle的,可以说是一款面向未来的工具,后续也值得我们深入学习 。)
从源码入手,一文带你读懂Spring AOP面向切面编程
创建一个Bean,TestBean 。
从源码入手,一文带你读懂Spring AOP面向切面编程
创建AOP的Aspect 。
从源码入手,一文带你读懂Spring AOP面向切面编程
然后写一个启动类代理器,测试以上配置
从源码入手,一文带你读懂Spring AOP面向切面编程
运行结果:
com.zack.demo.TestBean.getStr()开始执行...getStr():Testing!com.zack.demo.TestBean.getStr()方法结束...
Demo:
示例解析与AOP术语概念
看到上面的结果,很容易猜想到,LogAspect作用了在TestBean上,使得每次执行TestBean上的方法时,都会执行对应的方法(before/after) 。
LogAspect中带注解@Pointcut的allMethod(),是用来扫描程序中的连接点 。当执行一个方法时,命中了连接点,则会根据不同的通知,执行对应的织入代码 。在上面例子中,执行getStr()前会执行LogAspect中的before(),执行getStr()后会执行LogAspect中的after() 。
具体的通知包含
开发者在命中连接点时,可以通过以上不同的通知,执行对应方法 。这就是AOP中的Advisor 。
以上的内容其实已经把AOP核心的概念都已经点出来了,我们再深入具体的认识下其中的术语,
以上概念看起来可以还比较难懂,可以通过以下一图(来源于网络)来理解
从源码入手,一文带你读懂Spring AOP面向切面编程
请各位读者和各位程序员代理器,在阅读源码的时候,一定要先搞清楚基本概念,和一定一定要知道对应概念的英文,否则在看源码的时候,根本对不上号,使理解难度大大提高 。因为源码都是英文写的 。


以上关于本文的内容,仅作参考!温馨提示:如遇专业性较强的问题(如:疾病、健康、理财等),还请咨询专业人士给予相关指导!

「辽宁龙网」www.liaoninglong.com小编还为您精选了以下内容,希望对您有所帮助: