AOP到底有啥魅力?《Spring实战》系列 05

终于来到了 《Spring实战》第一部分的最后一章,“面向切面的Spring”,也是Spring第二把宝刀的精髓所在:AOP大法。

还记得AOP是什么吗?-----(Aspect-oriented-programming) 面向切面编程。切面是什么东东?反正不能吃。但是它的存在成功地降低了程序代码中的耦合度。此话怎讲?

在之前的文章中提到过,在一个应用程序中,代码除了需要完成它核心业务需求以外,还承担着一些通用功能的责任,比如说日志,事务,安全等。如果把所有的这些功能全部让业务逻辑代码去承担的话,那代码的耦合度将会非常的高,到时候会出现动一发而牵动全身的局面,这个时候就不是发挥“能力越大,责任越大”精神的时候了,这个时候应用程序面临的将会是难维护难修改难优化的困境。就这此时,AOP像救世英雄一样,踏着七彩祥云走到Spring身边,温柔地说:别怕老弟,有我呢。

好一句“有我呢”。AOP从此开启了Spring面向切面,降低耦合的新篇章。

那么AOP是如何做到的呢?

在进入某个领域之前,必须学会在这个领域该如何说话。师夷长技以制夷,我们先了解一下AOP中的专业术语。

切面(Aspect): 专业术语:被模块化的特殊的类就是切面。说人话就是,那些用来实现日志,安全,事务等功能的普通类,只不过多了一层身份,切!面!类!它是通知和切点的结合。

通知(Advice): 通知定义了切面是什么以及何时使用。什么意思?上面切面类里的具体功能内容就是由通知来定义的,以及什么时候使用这种功能。

Spring切面提供了五种类型的通知:
前置通知(Before): 在目标方法被调用之前调用通知功能
后置通知(After): 在目标方法被调用之后执行
环绕通知(Around):在目标方法执行前和执行后各调用一次
异常通知(After-throwing):在目标方法抛出异常之后调用
返回通知(After-returning):在目标方法成功执行之后调用,注意这里是成功执行哦

连接点(Joint point): 指在应用执行过程中能够插入切面的一个点,这个点可以是调用方法时,抛出异常时,甚至是修改一个字段时。就是业务核心代码里的某个点。

切点(Pointcut): 通知定义了切面的“what”和“when,那么切点定义的就是“where”何处。切点的定义会匹配通知所要织入的一个或多个连接点。

引入(Introduction):引入一看就是一个动作,它指我们可以向现有的类添加新方法和属性。

织入(Weaving): 织入是一个过程,把切面应用到目标对象并创建新的代理对象的过程。

现在我们已经了解了一些AOP的专业术语,那这些AOP的这些核心概念是如何在Spring中实现的呢?

等一下,这个AOP和Spring是个什么关系呢?

首先需要澄清的一点是,AOP是一个专门的框架,用来实现面向切面编程。AOP框架做的最好的是AspectJ项目,而Spring也是支持AOP的,所以被称为Spring AOP, 而且Spring对AOP的支持在很多方面借鉴了AspectJ项目。

搞清楚这三者之间的关系之后,我们再来看看AOP是如何在Spring中实现的。Spring提供了4种类型的AOP支持:
基于代理的经典SpringAOP;
纯POJO切面
@AspectJ注解驱动的切面
注入式AspectJ切面(适用于Spring各版本)

这四种类型哪一种最好用最常用呢?

答案是第三种:注入式AspectJ切面。因为它更加的简洁和干净,通过简单的声明式AOP和基于注解的AOP,可以使Spring中的AOP实现它的使命。但要注意的是Spring只支持方法级别的连接点,而其它AOP框架如AspectJ和JBoss,除了方法切点,还提供了字段和构造器接入点。但是方法拦截可以满足绝大部分的需求。

聊了这么多,快来看看这个切面到底是怎么产生和发挥作用的吧。

定义切面:

第一种方式:在一个普通类前面,加上@Aspect注解,加上各种你想要的通知,前文提到的那五种通知,并在通知里写好要执行的功能。
在这里插入图片描述

启用切面的功能有两条路,一是在JavaConfig类中加上@EnableAspectJAutoProxy注解。
在这里插入图片描述

二是通过Spring的aop命名空间启用AspectJ自动代理。
在这里插入图片描述

第二种方式:在XML中声明切面,并用对应的标签声明你所需要的各种通知和切点。
在这里插入图片描述

通过最后一章的学习,终于对Spring的核心“依赖注入”和“AOP”有了一个更深入的了解和认知,但这只是最基础的理论知识,在实际开发中一定会遇到各种各样的坑和麻烦,这个时候就要勤积累勤总结,多感悟多思考,真正把Spring的精神内涵内化于心。

路漫漫其修远兮,吾将上下而求索。我们下期再见~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值