【Spring进阶】AOP主要概念

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010028869/article/details/51228463

AOP主要概念

在面向对象编程的过程中,我门可能会遇到这样的情况:


1. 系统临近上线,测试过程中发现程序存在性能问题,于是经理下令将所有方法加上日志,打印出每个方法的执行时间,严格排查

2. 经理想要给一些核心模块添加操作日志,以便统计用户的行为,比如下单方法被调用多少次,支付方法调用多少次。

3. 当然还有事务四部曲,开,关,提交,回滚。


上述这些问题解决起来都挺简单的,就是手动的给每个方法添加相应的日志,事务代码,不用了在一一删除就行。简单是简单,万一项目有成百上千个方法呢,程序猿就该郁闷了。


这时候程序猿的福音AOP来了:

它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。

什么是方面呢?所谓“方面”,简单地说,就是上述问题中的日志,事务等,这些代码,服务与具体业务无关,却为业务模块所共同调用。

AOP做的事就是讲这些逻辑或服务封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。


Spring AOP的一些相关概念

方面(Aspect):对横切性关注点的模块化,简单来说就是讲具体业务无关的代码,比如日志,事务等单独封装到一个类中。

通知(Advice): 在特定的连接点,AOP框架执行的动作,是对横切性关注点的具体实现。各种类型的通知包括“around”、“before”和“throws”通知。 许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。Spring中定义了四个advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice

连接点(Joinpoint): 程序执行过程中明确的点,即Advice在应用程序上执行的点或时机,如方法的调用或特定的异常被抛出。Spring只支持方法的JoinPoint 。

切入点(Pointcut): 它定义了Advice应用到哪些JoinPoint上,对Spring来说是方法调用、指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式。 Spring定义了Pointcut接口,用来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解, MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上

引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。Spring中要使用Introduction, 可有通过DelegatingIntroductionInterceptor来实现通知,通过DefaultIntroductionAdvisor来配置Advice和代理类要实现的接口

目标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。POJO

AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。

织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。


小结

使用AOP技术后,上面的问题也就不是问题了,将这些公共的代码封装到一个单独的服务模块中,想添加操作日志,配置一下;想测试方法执行时间,配置一下,大大降低了工作量,降低耦合度。

正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”

猜你喜欢

转载自blog.csdn.net/u010028869/article/details/51228463