Spring系列之 (七):AOP

1.什么是AOP

2.AOP常用术语

一、什么是AOP

AOP(Aspect-OrientedProgramming,面向切面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为"Aspect",即方面。所谓“切面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系。

使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

AOP主要用于日志记录,性能统计,安全控制(权限控制),事务处理,异常处理等。将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。


实现AOP的技术,主要分为两大类:

一.是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;

Spring AOP织入增强(Advice)的方式有两种: 

1.连接点实现了接口采用jdk自带的动态代理的形式实现织入,

2.如果连接点没有实现接口则采用动态字节码生成技术(CGLIB)实现织入。

二.是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。基于AsceptJ


二、AOP常用术语:8个点

1.连接点(Joinpoint)
 被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法

2.切点(Pointcut)

 切点是一组连接点的集合。AOP通过“切点”定位特定的连接点。通过数据库查询的概念来理解切点和连接点的关系再适合不过了:连接点相当于数据库中的记录,而切点相当于查询条件。

3.增强(Advice),也叫通知

  增强是织入到目标类连接点上的一段程序代码。表示要在连接点上做的操作。会将 advice 模拟为一个拦截器(interceptor), 并且在 join point 上维护多个 advice, 进行层层拦截.分为前置、后置、异常、最终、环绕通知五类

4.目标对象(Target)
  代理的目标对象Spring AOP 使用运行时代理的方式来实现 aspect,织入 advice 后所产生的代理类

5.引介(Introduction)
  在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段

6.织入(Weaving)
 将 aspect 和其他对象连接起来, 并创建 adviced object 的过程,AOP有三种织入的方式:
a.编译期间织入,这要求使用特殊的java编译器;
b.类装载期织入,这要求使用特殊的类装载器;
c.动态代理织入,在运行期为目标类添加增强生成子类的方式。
Spring采用动态代理织入,而AspectJ采用编译器织入和类装载期织入。

7.代理(Proxy)
一个类被AOP织入增强后,就产生出了一个结果类,它是融合了原类和增强逻辑的代理类

8.切面(Aspect)

通知、连接点、切入点共同组成了切面:时间、地点和要发生的“故事

总结:AOP的工作重点就是如何将增强应用于目标对象的连接点上,这里首先包括两个工作:

第一,如何通过切点和增强定位到连接点;

第二,如何在增强中编写切面的代码。

可以简单地认为, 使用 @Aspect 注解的类就是切面.

通知类型Advice:

1.before:前置通知(应用:各种校验)

在方法执行前执行,如果通知抛出异常,阻止方法运行

2.afterReturning:后置通知(应用:常规数据处理)

方法正常返回后执行,如果方法中抛出异常,通知无法执行,必须在方法执行后才执行,所以可以获得方法的返回值。

3.around:环绕通知(应用:十分强大,可以做任何事情) 【掌握

方法执行前后分别执行,可以阻止方法的执行。要求必须手动的执行目标方法。

4.afterThrowing:抛出异常通知(应用:包装异常信息)

方法抛出异常后执行,如果方法没有抛出异常,无法执行

5.after:最终通知(应用:清理现场)

方法执行完毕后执行,无论方法中是否出现异常


关于join point 和 point cut 的区别

在 Spring AOP 中, 所有的方法执行都是 join point. 而 point cut 是一个描述信息, 它修饰的是 join point, 通过 point cut, 我们就可以确定哪些 join point 可以被织入 Advice. 因此 join point 和 point cut 本质上就是两个不同纬度上的东西.
advice 是在 join point 上执行的, 而 point cut 规定了哪些 join point 可以执行哪些 advice


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值