aop切面类型,aop切面实现

aop切面类型,aop切面实现,面向切面编程(AOP)的理解

本文主要介绍对面向方面编程(AOP)的理解,有需要的朋友可以参考一下。

传统上,在编写业务逻辑处理代码时,我们通常习惯性地做几件事:日志记录、事务控制和权限控制,然后再编写核心的业务逻辑处理代码。当代码写完回头看,我们不禁发现,几百行代码中,真正用于核心业务逻辑处理的只有几行,如图6-4所示。复法,类复类,就这样,带着无奈和遗憾过了多少年。那很好。如果在项目结束时,突然决定在权限控制上需要大的改变,成千上万的方法要一个一个地‘拜访’,痛苦会‘更严重’。

如果我们能把图6-4所示的方法中的所有公共代码提取出来,放在某个地方集中管理,然后在具体操作时把这些公共代码动态编织到容器中,至少可以解决两个问题:

Java程序员在编写具体的业务逻辑处理方法时,只需要关心核心的业务逻辑处理,既提高了工作效率,又使得代码改动简洁优雅。

在以后的维护中,业务逻辑代码和常用代码分开存放,常用代码集中存放,维护工作变得简单易行。

面向方面编程AOP技术就是为了解决这个问题而诞生的,方面就是横向方面,如图6-5所示,表示一个常见的功能,比如日志方面,权限方面,事务方面。

让我们以用户管理业务逻辑组件UserService(见图6-6)的AOP实现过程为例,深入分析AOP技术的实现原理。AOP技术基于Java语言的反射机制和动态代理机制。当业务逻辑组件运行时,AOP容器将动态创建一个代理对象供用户调用。代理对象已经按照Java EE程序员的意图,成功地将section切入了目标方法的连接点,从而可以同时执行section的功能和业务逻辑的功能。原则上,调用者直接调用AOP容器动态生成的代理对象,然后代理对象调用目标对象完成原来的业务逻辑处理,而代理对象已经用业务逻辑方法合成了方面。

现在对图6-6中涉及的一些概念解释如下。

看点:其实就是常用功能的实现。如日志部分、权限部分、交易部分等。在实际应用中,通常是一个普通的Java类,存储常用的函数实现。之所以能被AOP容器识别为section,是在配置中指定的。

忠告:是小节的具体实现。以目标法为参照点,根据地点不同可分为前、后返、后抛、后绕)5种。实际上,它通常是section类中的一个方法,具体的通知类型也在配置中指定。

连接点(Joinpoint):是程序运行时可以插入切面的地方。比如方法调用,异常抛出或者字段修改,但是Spring只支持方法级的连接点。

切入点:用于定义通知应该切入的连接点。不同的通知通常需要切割成不同的连接点,这种精确匹配是由切割点的正则表达式定义的。

目标:即将切入切面的那些对象,也就是被通知的那些对象。这些对象中只剩下干净的核心业务逻辑代码,所有常用的功能代码都在等待AOP容器的切入。

代理:在通知应用于目标对象后动态创建的对象。可以简单理解为代理对象的功能等于目标对象的核心业务逻辑功能加上共享功能。代理对用户是透明的,是程序运行过程的产物。

编织:将切面应用到目标对象以创建新代理对象的过程。这个过程可以发生在编译时、类加载时和运行时。当然,不同的发生点有不同的前提条件。例如,如果它发生在编译时,就需要一个支持这种AOP实现的特殊编译器;在类加载期间,需要一个支持AOP实现的特殊类加载器。只有在运行时发生,才能通过Java语言的反射机制和动态代理机制直接动态实现。

以下是补充:

AOP是Aspect Oriented Programming的缩写,意思是:面向方面编程,通过预编译和运行时动态代理实现程序功能的统一维护。

AOP和OOP是两种面向不同领域的设计思想。

OOP(面向对象编程)对业务流程的实体、属性和行为进行抽象和封装,以获得更清晰、更高效的逻辑单元划分。

而AOP则是在业务处理过程中抽取切面,面向处理过程中的某个步骤或阶段,从而获得逻辑过程中各部分之间低耦合的隔离效果。

如果我们只能从字面上理解AOP和OOP,用下面的理解也不为过:

OOP实际上是对对象的属性和行为的封装,但AOP谈不到这一点。但是,AOP处理某个步骤和阶段,并从中提取小节。也就是说,如果几个或几个以上的逻辑流程中存在重复操作,AOP可以提取出来,利用动态代理实现程序功能的统一维护。所以可能太含蓄了。如果说权限判断,日志等。你可能明白。如果单纯用OOP,权限判断呢?每次操作前增加权限判断?伐木呢?在每个方法的开头、结尾和异常的地方手动添加日志?所以,如果使用AOP,这些重复的操作可以通过代理来完成,在逻辑流程中可以减少部分之间的耦合。两者相辅相成,互相结合最好。

下面详细介绍AOP的一些概念:

方面:一个关注点的模块性,它可能另外跨越多个对象。事务管理是J2EE应用程序中横切关注点的一个好例子。方面是用Spring的Advisor或拦截器实现的。

连接点(Joinpoint ):程序执行过程中的一个显式点,比如调用一个方法或者抛出一个特定的异常。

建议:AOP框架在特定连接点执行的动作。各种类型的通知包括“周围”、“之前”和“投掷”通知。通知类型将在下面讨论。许多AOP框架,包括Spring,使用拦截器作为通知模型,并在连接点“周围”维护一系列拦截器。

切入点:指定一组触发通知的连接点。AOP框架必须允许开发人员指定切入点,例如,使用正则表达式。

简介:向通知的类添加方法或字段。Spring允许向任何被通知的对象引入新的接口。例如,您可以使用一个简介让任何对象实现IsModified接口来简化缓存。

目标对象:包含连接点的对象,也称为通知对象或代理对象。

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

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

Spring中的AOP代理由Spring的IoC容器生成和管理,它的依赖关系也由IoC容器管理。至于Spring的AOP在项目中是如何实现的,下篇博客将以日志为例来学习。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: