spring入门学习-5、AOP概念及特点

  • 什么是AOP

AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。

在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面)

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

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

Spring AOP不是一个完整的AOP(仅支持方法连接点),而是侧重于提供一种AOP实现和Spring IOC容器之间的整合,用于帮助解决企业应用中常见的问题。

 

 

  • AOP使用场景

日志记录

性能统计

安全控制

事务处理

异常处理

  • AOP术语

1)切面(Aspect)

定义:切面是通知和切点的集合,通知和切点共同定义了切面的全部功能——它是什么,在何时何处完成其功能。

工作内容:①如何通过切点和通知定位到连接点上;

      ②如何在通知中编写切面代码;

2)通知/增强(Advice)

定义:在AOP中描述切面要完成的工作被称作通知。

工作内容:通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决何时执行这个工作。

Spring中5种通知类型:

①前置通知(Before advice):在某个连接点之前执行的通知,但不能阻止连接点执行(排除异常)。简单的说是在目标方法被调用前调用通知功能。

②后置通知(After advice):在某连接点退出的时候执行的通知(不论是正常返回还是异常退出类似finally)。简单的说是在目标方法调用之后调用的通知。

③返回通知(After-returning advice):在某个连接点正常完成后执行的通知。简单的说在目标方法执行结束后调用的通知。

④异常通知(After-throwing):在方法抛出异常时执行的通知。

⑤环绕通知(Around):包围一个连接点的通知。简单说是在被通知的方法调用前和调用后执行自定义的行为。

3)连接点(Join poin)

定义:一个应用执行过程中能够插入切面的点。连接点可以是调用方法时、抛出异常时、甚至是修改好字段时。

作用:切面代码可以利用这些定义的点插入(织入)到正规流程中。

注意:spring连接点总是方法的执行点,即只有方法连接点。

4)切点(Poin cut)

定义:如果通知定义了“什么”和“何时”。那么切点就定义了“何处”。切点会匹配通知所要织入的一个或者多个连接点

解释:在 Spring 中, 所有的方法都可以认为是 joinpoint, 但是我们并不希望在所有的方法上都添加 Advice, 而 pointcut 的作用就是提供一组规则(使用 AspectJ pointcut expression language 来描述) 来匹配joinpoint, 给满足规则的 joinpoint 添加 Advice

作用:定义通知被应用的位置(在哪些连接点)

 

连接点(join poin)和切点(cut poin)的区别

 

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

5)引入(Introduction)

定义:允许我们向现有类中添加方法和属性。

6)织入(Weaving)

定义:织入描述的是把切面应用到目标对象来创建新的代理对象的过程

织入有一下几种方式:

①编译器织入:切面在目标类编译时期被织入,这种方式需要特殊编译器。AspectJ的织入编译器就是以这种方式织入切面。

②类装载器织入:这种方式需要特殊的类加载器,他可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5 的 LTW 就支持这种织入方式

③动态代理织入:切面在应用运行期间的某个时刻被织入。一般情况下,在织入切面时候,AOP 容器会为目标对象动态的创建代理对象。Spring AOP 就是以这种方式织入切面。

7)顾问(Advisor)

<aop:aspect>实际上是定义横切逻辑,就是在连接点上做什么,<aop:advisor>则定义了在哪些连接点上应用什么<aop:aspect>。Spring这样做的好处就是可以让多个横切逻辑 (即<aop:aspect>定义的)多次使用,提供可重用性。 

总的来说:
    1、Adivisor是一种特殊的Aspect,Advisor代表spring中的Aspect 
    2、advisor只持有一个Pointcut和一个advice,而aspect可以多个pointcut和多个advice

事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。 

8)目标(Target)

定义:被通知或被代理的对象。

9)代理(Proxy

定义:向目标对象应用通知之后的对象。

解释:Spring AOP两种实现方式:

一是动态代理方式(JDK动态代理和CGLib动态代理),采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行二是预编译的方式(AspectJ),引入特定的语法创建“方面”,从而使得编译器可以在编译期间加入有关“方面”的代码。

     Spring AOP 默认使用标准的 JDK 动态代理(dynamic proxy)技术来实现 AOP 代理, 通过它, 我们可以为任意的接口实现代理.
如果需要为一个类实现代理, 那么可以使用 CGLIB 代理. 当一个业务逻辑对象没有实现接口时, 那么Spring AOP 就默认使用 CGLIB 来作为 AOP 代理了. 即如果我们需要为一个方法织入 advice, 但是这个方法不是一个接口所提供的方法, 则此时 Spring AOP 会使用 CGLIB 来实现动态代理. 鉴于此, Spring AOP 建议基于接口编程, 对接口进行 AOP 而不是类。

  • Spring对AOP的理解

并不是所有的 AOP 框架都是一样的,他们在连接点模型上可能有强弱之分有些允许对字段修饰符级别应用通知有些支持方法调用连接点

因为 Spring 基于动态代理,所以 Spring 只支持方法连接点。

Spring 缺失对字段连接点的支持,无法让我们更加细粒度的通知,例如拦截对象字段的修改

Spring 缺失对构造器连接点支持,我发在 Bean 创建时候进行通知

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值