如上图所示:里面涉及到几个概念:Aspect、Advice、PointCut、joinPoint
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
Cross cutting concern:在我们的程序中会存在一些类似于:安全性检查、事务、记录日志等和业务没有密切关系的独立服务,它们遍布于系统的各个角落,我们就可以把这些东西拿出来,这也实现了解耦合的目的,而这些东西可以看做是横切性关注点(Cross cutting concern)
Aspect:将横切性关注点模块化的称之为Aspect,Aspect 声明类似于 Java 中的类声明
Advice:对横切性关注点的具体实现称之为Advice,包含before Advice、after Advice、throw Advice
Joinpoint:表示在程序中明确定义的点,典型的包括方法调用
PointCut:它定义了Advice要发生的地方,可以理解为切入点,它定义了Advice要应用到那些Joinpoint,典型的利用一套表达式,例如上图表示凡事以add方法开头的方法,当然前面肯定是要包含包的,例如那些包下面的以什么开头或者以什么结尾的方法等等,当然表达式很强大,这里不一一阐述
Weave:将Advice应用到target objcet上的过程叫做植入,spring支持的是动态植入
最为强大的AOP的实现是AspectJ,它不但可以作用方法上,还可以作用到譬如类属性的改变等等
还有几个概念:target object、proxy、introduction
target object :advice被应用的对象
proxy:Spring默认使用的是JDK的动态代理,它的代理是运行时创建,也可以使用CGLIB代理
introduction:可以动态的为类添加方法
在某些AOP的实现中没有这两个概念,因为他们在编译期间就将Advice和joinPoint编译到了一起,这样就形成了静态的代理,而Spring中的AOP则是动态代理,在程序运行时动态的生成代理(proxy),然后在代理中调用Advice和target objcet 相应的方法