JavaEE学习03(面向切面编程(AOP))

一、AOP概念

AOP的原理:
(1)将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决。
(2)采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能。
JavaEE学习03(面向切面编程(AOP))

通过动态代理实现AOP(采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行)。
AOP是一种思想,它与具体的实现技术无关,任何一种符合AOP的思想的技术实现,都可以看做是AOP的实现。通过java的动态代理机制,就可以很容易实现AOP的思想,实际上Spring的AOP也是建立在Java的代理机制上。——我们发现AOP实际上是由目标类的代理类实现的。AOP代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用。AOP代理包含了目标对象的全部方法,但是AOP代理中的方法与目标对象的方法存在差异,AOP方法在特定切入点添加了增强处理,并回调了目标对象的方法。

总结AOP理解:
业务处理的主要流程就是核心关注点,与之关系不大的部分就是横切关注点。横切关注点的一个特点就是:他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事务处理。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
所谓面向切面编程,是一种通过预编译和运行期动态代理的方式实现在不修改源代码的情况下给程序动态添加功能的技术。

二、AOP相关术语

增强(Advice):又翻译成通知,定义了切面是什么以及何时使用,描述了切面要完成的工作和何时需要执行这个工作。是织入到目标类连接点上的一段程序代码。增强包含了用于添加到目标连接点上的一段执行逻辑,又包含了用于定位连接点的方位信息。
所以spring提供的增强接口都是带方位名:BeforeAdvice(表示方法调用前的位置)AfterReturninAdvice(表示访问返回后的位置)ThrowAdvice等等,所以只有结合切点和增强两者一起才能确定特定的连接点并实施增强逻辑。
增强又分前置增强、后置增强、环绕增强、异常抛出增强、最终增强等类型。
JavaEE学习03(面向切面编程(AOP))

三、AOP的基本概念

Advice直译为“通知”,但这种叫法并不确切,在此处翻译成“增强处理”更便于大家理解。
切入点(Pointcut):Advice定义了切面要发生“故事”和时间,那么切入点就定义了“故事”发生的地点。例如某个类或者方法名,Spring中允许我们使用正则来指定。
连接点(Joinpoint):切入点匹配的执行点称作连接点。如果说切入点是查询条件,那连接点就是被选中的具体的查询结果。程序执行的某个特定位置,程序能够应用增强代码的一个“时机”,比如方法调用或者特定异常抛出。
切面(Aspect):切点和增强组成切面。它包括了横切逻辑的定义,也包括了连接点的定义。Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。
代理(Proxy):AOP框架创建的对象。一个类被AOP织入增强之后,就产生了一个结果类,它是融合了原类和增强逻辑的代理类。
目标对象(Target):增强逻辑的织入的目标类。
织入(Weaving):将增强添加到目标类具体连接点上的过程。AOP有三种织入的方式:编译期织入、类装载期织入、动态代理织入(spring采用动态代理织入)。

面向切面编程主要关心两个问题,即:在什么位置,执行什么功能。Spring AOP是负责实施切面的框架,即由Spring AOP完成织入工作。
通知方法:
前置通知:在我们执行目标方法之前运行(@Before)
后置通知:在我们目标方法运行结束之后 ,不管有没有异常(@After)
返回通知:在我们的目标方法正常返回值后运行(@AfterReturning)
异常通知:在我们的目标方法出现异常后运行(@AfterThrowing)
环绕通知:动态代理, 需要手动执行joinPoint.procced()(其实就是执行我们的目标方法执行之前相当于前置通知, 执行之后就相当于我们后置通知(@Around)