AOP就是面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
可能这样说大家不是理解的很明白,那么请看下面的代码。
假设有一个业务组件Component,其中有3个业务方法:
现在有一个需求,在不改动业务逻辑代码的情况下,在每个业务方法执行前都必须执行一个用户验证,如下:
在这个情况下我们就用到了AOP。
AOP有如两种实现方式
1.静态代理
2.动态代理
特点
①程序中调用执行的是代理对象,构造代理对象时给它一个被代理对象;
②代理对象代替真正的对象来执行其方法,并在执行过程中添加额外的职责;
③代理对象的一个接口只服务于一种类型的对象,如果代理的方法很多,势必要为每种方法进行代理。
1.将Component 的业务逻辑拿出来创建一个接口,
2.实现代理对象,这个实现了业务逻辑接口
3.测试函数
特点:使用动态代理可以使得一个处理者(Handler)服务于各个对象
通过实现InvocationHandler接口实现动态代理
测试函数
使用代理对象将日志等与业务逻辑无关的动作或任务提取出来,设计成为一个服务对象称为Aspect,将上述这些与业务逻辑无关的动作在AOP中称之为Cross-cutting concern
Aspect
散落于各个业务逻辑之中的Cross-cutting concerns收集起来,设计成为独立可重用的对象,称为Aspect。
Advice
Aspect当中对Cross-cutting concerns的具体实现称为Advice
Jointpoint
Advice在应用程序执行时加入业务流程的点或时机(只支持方法的Jointpoint)
Pointcut
Pointcut定义了感兴趣的Jointpoint,当调用的方法符合Pointcut表达式时,将Advice织入到应用程序中。
Target
被代理的对象(一个Advice被应用的对象)
Introduction
可以为某个已编写或编译完的类,在执行时期动态加入一些方法
Weave
Advice被应用到Target上的过程,不同时间点(Compile、Classload、Runtime)
由于Weave到Target的时机不同,Spring提供了几种不同的Advices(Before Advice、After Advice 、Around Advice、Throw Advice)
例如:beforeadvice可通过实现MethodBeforeAdvice接口实现
便可在执行icom.business1();之前调用用户验证
其余advice也是一样
在Spring2.0中,可以使用标签来定义After Returning Advice,不用实现AfterReturningAdvice接口,此文不在描述,想学习者自行找资料学习。(需要架包 aspectjweaver.jar、asm-.jar、asm-commons-.jar
)