Spring AOP 理解思想(一)

我眼中的AOP

在我眼中AOP会有很多的概念,很多的术语,主要是面向切面编程。通俗的讲减少重复代码,少写代码达到相同的目的。面向切面编程(AOP, Aspect Oriented Programming)就是一种减重复代码方式。

什么是切面?

就是用一把刀来切一坨面。注意,相对于面而言,我们一定是横着来切它,这简称为“横切”。可以把一段代码想象成一坨面,同样也可以用一把刀来横切它,下面要做的就是介绍这把刀!

                                         

AOP的概念

如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数事务据库中切面编程被广泛使用。

 

AOP的目的

AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码降低模块间的耦合度,并有利于未来的可拓展性和可维护性

 

举个例子

角色:包租婆、中介商。

包租婆手里有几套房子准备出租,不过出租房子步骤有很多,带租客看房、谈价格、签合同、收房租、交钥匙等一系列的动作。

 

                                         

在上面的例子中,包租婆的核心业务就是签合同,收房租,那么这就够了,灰色框起来的部分都是重复且边缘的事,交给中介商就好了,这就是 AOP 的一个思想:让关注点代码与业务代码分离!

AOP的相关术语

描述切面的常用术语有通知(advice)、切点(pointcut)和连接点(join point)是如何关联在一起的 。

                       

通知(Advice)

切面也有目标——它必须要完成的工作。在AOP术语中,切面的工作被称为通知。

Spring 切面可以应用5种类型的通知

前置通知(Before):在目标方法被调用之前调用通知功能;

后置通知(After): 在目标方法完成之后调用通知,此时不会关心方法的输出是什么;

返回通知(After-returning): 在目标方法成功执行之后调用通知;

异常通知(After-throwing): 在目标方法抛出异常后调用通知;

环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

切点(Pointcut

一个项目中有很多的类,一个类有很多个连接点,当我们需要在某个方法前插入一段增强(advice)代码时,我们就需要使用切点信息来确定,要在哪些连接点上添加增强。

那么切点是什么?

如果把连接点当做数据库中的记录,那么切点就是查找该记录的查询条件。

所以,一般我们要实现一个切点时,那么我们需要判断哪些连接点是符合我们的条件的,如:方法名是否匹配、类是否是某个类、以及子类等。

连接点(Join point)

连接点就是程序执行的某个特定的位置,如:类开始初始化前、类初始化后、类的某个方法调用前、类的某个方法调用后、方法抛出异常后等。Spring 只支持类的方法前、后、抛出异常后的连接点。

切面(Aspect)

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

引介(Introduction)

引介是一种特殊的增强,它为类添加一些属性和方法,这样即使一个业务类原本没有实现某个接口,通过AOP的引介功能,我们可以动态的为该业务类添加接口的实现逻辑,让这个业务类成为这个接口的实现类。

目标对象(Target)

目标对象就是我们需要对它进行增强的业务类,如果没有AOP,那么该业务类就得自己实现需要的功能。

织入(Weaving)

织入是将增强添加到目标类具体连接点上的过程,AOP就像一台织布机,将目标类、增强或者引介编织到一起,AOP有三种织入的方式:
a.编译期间织入,这要求使用特殊的java编译器;
b.类装载期织入,这要求使用特殊的类装载器;
c.动态代理织入,在运行期为目标类添加增强生成子类的方式。
Spring采用动态代理织入,而AspectJ采用编译器织入和类装载期织入。

AOP代理(AOP proxy)

一个类被AOP织入后生成出了一个结果类,它是融合了原类和增强逻辑的代理类。

总结:

我们现在可以把之前分散在应用各处的行为放入可重用的模块中。我们显示地声明在何处如何应用该行为。这有效减少了代码冗余,并让我们的类关注自身的主要功能。

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值