`
hht_mmtchina
  • 浏览: 12210 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AOP的四种主要Java实现方式

aop 
阅读更多
对于下面描述,我至看懂了springFramework 这一个说的意思,其他的没用用过,现在只是了解下。

据统计,目前与AOP相关的项目已达近百种,而基于Java的AOP实现机制也有二十多种,以下所列举的是商业上得到成熟应用的几种基于Java的AOP的实现机制。
AspectJ


    AspectJ是目前最完善的AOP语言,由AOP的首倡者Gregor Kiczales领导的一个小组提出并得到发展。AspectJ是对Java编程语言的扩展,通过增加了一些新的构造块支持对横切关注点的模块化封装,通过对源代码级别的代码混合实现织入,是一种典型的使用静态织入的AOP实现机制。AspectJ提供了两种横切实现机制,一种称为动态横切(Dynamic Crosscutting),另一种称为静态横切(Static Crosscutting)。


  动态横切是指在程序执行的某一个明确的点上运行额外的,预先定义好的实现,是一种静态实现机制,并非是动态的。为了实现动态横切,AspectJ中引入了四个新的概念:连接点(Join Point),切入点(Pointcut),参考(Advice)和方面(Aspect)。连接点是明确定义的程序执行过程中的一个点,切入点则是指一组相关的连接点,参考定义了在连接点执行的额外实现,方面则是指对横切关注点的模块化封装实现的单元,类似于AOP中的类,由切入点,参考与普通的Java成员声明组成。如前所述,连接点是程序执行中明确定义的点,比如,类接受到方法调用时,方法调用时,属性访问时都是连接点的例子,在连接点处可以执行预定义的额外实现。而要指明在哪些连接点上执行,则需要定义切入点,切入点可以在程序运行时匹配特定的连接点,AspectJ中预定义了一系列标准切入点,包括方法与构造器的调用,接受调用,执行,域的get,set访问,异常处理,实例类型匹配,处于类或方法体中,控制流中,调用者调用方法,类型的初始化与静态初始化,通过这些预定义切入点的组合可以实现自定义的、复杂的切入点。在编译时,方面中的参考将被转化为标准的方法,类代码中匹配切入点的连接点将被转化为一个静态的标记点,然后,这些静态的点将被对参考所转化成的方法的调用所取代,由此完成两种代码的织入,最后对织入完成的代码编译为字节码,即完成了整个编译过程。目前,AspectJ即支持编译前的预处理方式实现代码的织入,也支持编译后的字节码操作。


  静态横切是指对已存在的类型定义引入新的方法,属性等,与动态横切不同,静态横切不改变类型的动态行为,而是改变其静态结构,也即导入(Introduction)。通过在方面代码中声明方法,属性,需要继承的超类,接口等,在代码织入时,可以改变应用此方面的类的定义。

AspectWerkz


    AspectWerkz是一个动态的AOP框架,利用对字节码的修改实现方面的织入,并使用Java虚拟机的动态替换字节码的能力实现动态AOP的要求。AspectWerkz没有扩展Java语言,方面、参考、切入点等均使用标准的Java构造块,即类以及方法来实现,并使用XML文件定义这些构造块,此外AspectWerkz还支持使用JavaDoc标记实现的运行期属性定义。AspectWerkz采用了与AspectJ相似的连接点模型,只是支持的连接点种类少于AspectJ,参考的类型一致。


    AspectWerkz通过引入一个间接层,方面容器(Aspect Container)以及对字节码的转化,即代码织入实现动态AOP的要求,方面容器管理部署好的类、方面代码,并根据XML文件或JavaDoc注释中定义的方面,参考,切入点等得到连接点处相关的方面信息,并在程序的执行中控制执行流程,在匹配的连接点处执行适当的参考。


    AspectWerkz通过类载入层次的适当位置拦截类载入从而实现字节码的修饰。AspectWerkz提供了两种织入模式实现AOP:静态织入以及动态织入。静态织入只在类载入时对字节码作一次性的转化,通过将类的方法实现移入AspectWerkz命名的方法中,将原方法中的代码改写,由方面容器调用适当的参考,并调用前述AspectWerkz添加的方法从而完成代码的织入。导入则由混合类型(Mixin)实现,用于为类增加新的方法,混合类型是一种使用接口与实现类的方式模拟多重继承的机制。AspectWerkz通过修改字节码使被导入的类实现混合类型的接口,并在接口定义的方法中,将控制交给容器管理器,由它来完成对实现的调用。静态织入可以在运行时动态的为切入点增加,删除参考,可以引入新的参考,但是无法定义新的切入点,这需要动态织入。动态织入由两阶段织入完成,分别为类载入阶段与激活阶段。首先,在类载入时,按照静态织入的方法,为需要实现动态织入的类的每个方法添加一个相应的空的方法,匹配连接点的方法除外。然后,在激活阶段,原方法体中的代码将被交换到类载入时新产生的方法中,原方法将实现静态织入时相同的处理,从而方面容器控制流程。前述代码交换是由热交换(HotSwap)实现的,这是JVM提供的API。通过方面容器与织入模型,AspectWerkz提供了动态AOP的实现。


SpringFramework


    SpringFramework是一个采用了反转控制(Inversion of Control, IoC)策略的基于J2EE的轻量级应用框架。SpringFramework的核心是IoC容器,对于其它应用,如数据库访问,日志等,SpringFramework多使用现有的、成熟的框架。SpringFramework采用了模块化的方式,各模块可以共同使用,也可以单独使用其中的一个模块, SpringFramework的一个模块提供了对动态AOP的支持,SpringFramework中提供的声明式事务管理就是基于动态AOP的。


    SpringFramework中AOP的实现基于动态代理(Dynamic Proxy), 动态代理源于代理模式,即通过接口实现对业务对象的访问,但动态代理无需为每一个需代理的业务对象静态的生成代理对象,只需提供需要代理的接口与代理实现,就可以在运行时动态的生成代理对象,代理对上述接口的访问,同样的机制也使用于对类的代理,使用类似于修饰者的模式,通过子类化实现。SpringFramework默认使用JDK提供的动态代理机制,此时,业务对象通过接口编程,若需要代理对类的访问,则需要使用CGLIB,这是一个开源的动态代理实现。


    SpringFramework的AOP实现不同于AspectJ与AspectWerkz,它不是完全的AOP实现,而是设计用于在应用服务器环境下实现AOP,与SpringFramework的IoC容器配合使用。SpringFramework中参考,切入点与方面均由普通Java对象实现,其中连接点模型与AspectJ相同,只是远不如AspectJ丰富,目前只提供对方法调用的拦截。有4种类型的参考,分别为方法调用时,之前,返回时与抛出异常时,通过实现SpringFramework的参考接口可以自定义参考类型。在SpringFramework中,方面称为Advisor,是一个包含参考与切入点的Java类。像其它由IoC容器管理的组件一样,参考,切入点与方面也由IoC容器管理 ,由XML配置文件定义。配置的内容包括业务对象的接口与实现,自定义的或由SpringFramework提供的切入点与参考类,或使用Adviser类取代单独的切入点与参考类。在运行时,通过IoC容器进行名称查找,就可以由容器使用代理机制自动产生代理对象,并在符合切入点定义的连接点处执行参考。SpringFramework除自身实现的AOP框架外,还在寻求与其它AOP实现机制的整合,目前已经实现了与AspectJ的整合,以利用AspectJ丰富的切入点语法,并利用AspectJ的方面实现。

JBoss


    JBoss是一个开源的符合J2EE规范的应用服务器,作为J2EE规范的补充,Jboss中引入了AOP框架,为普通Java类提供了J2EE服务,而无需遵循EJB规范。Jboss通过类载入时,使用Javassist对字节码操作实现动态AOP框架,Javassist是一个开源的编辑字节码的类库。


    Jboss中参考,切入点与方面也由普通Java对象实现,并使用XML文件配置。Jboss的连接点模型与AspectJ略有不同,提供了一系列预定义的切入点,包括类匹配,方法调用,构造器调用,域访问,特定的调用与被调用关系。通过这些切入点的逻辑运算,可以实现更为复杂的切入点。方面为Java类,参考是其中的一个方法,方面中不含切入点,方面主要为各种拦截器(Interceptor),拦截器即为只含一个参考的方面,单一连接点上可由多个拦截器形成拦截器链,拦截器执行额外的操作。对方法的拦截由Advisor类管理,在连接点依次调用拦截器,并最终调用被逻辑的方法。而关于切入点,参考已及方面的信息由AspectManager管理。此外,Jboss提供对元数据的支持,用于为类,方法,构造器以及域添加额外的属性,并可在运行期访问。



  为实现拦截,Jboss需要修改类的字节码,大致过程如下。XML配置文件中关于切入点,拦截器,元数据以及混合类的信息在应用程序部署时被读入、解析,并生成相应的对象,这些信息与实例化的对象由AspectManager管理。在需要混入方面代码的类载入时,AspectManager将创建Advisor类,将方面相关信息传递给它,并对类的字节码进行修改,之后将修改过的字节码交给类载入器完成类的装载。字节码的修改主要是对被载入的类添加一系列方法用于代理那些匹配连接点的方法调用,构造器调用,域访问以及方法导入,转为对Advisor类相应方法的调用。类中各方法将重命名,保留原方法体,并添加一个与原方法同名的方法,在这个方法中调用那些代理方法,用来将调用代理给Advisor类,或调用重命名的原方法。对于域访问,分别添加两个方法,对应于读与写操作,将域访问代理至Advisor类,在访问这个域的类中,则需将对域的访问转换为对上述方法的调用。对于构造器调用,则添加一个方法,将调用代理至Advisor类,并对构造对象的类的构造代码作相应转换。对于导入,被导入的类中将添加一个混合类实现的引用,并添加混合类接口中的方法,将对混合类方法的调用代理至Advisor类,并最终调用混合类的实现。相关类载入后,初始化Advisor类,填入拦截器链,以完成整个处理过程。
分享到:
评论

相关推荐

    Spring AOP 常用的四种实现方式

    本篇文章将深入探讨Spring AOP的四种常见实现方式。 一、基于接口的代理(Interface-Based Proxy) 这是Spring AOP最基础的实现方式,适用于目标对象实现了特定接口的情况。Spring会创建一个代理对象,该对象实现...

    aop的四种实现方式

    **Java 动态代理**是Java标准库提供的另一种实现AOP的方式,主要针对接口。它允许我们创建一个代理类,该类在调用目标接口方法之前和之后执行自定义逻辑。这在处理基于接口的切面时非常有用。 ```java interface ...

    Spring AOP 常用的四种实现方式的代码

    本篇文章将详细讲解Spring AOP的四种常见实现方式,以帮助开发者更好地理解和运用这一功能。 一、基于接口的代理(Interface-Based Proxy) 这是Spring AOP的默认实现方式,适用于目标对象实现了接口的情况。Spring...

    aop思想的java实现

    总结,AOP思想的Java实现主要有静态代理和动态代理两种方式。静态代理适用于代理类相对固定的场景,而动态代理则更加灵活,可以在运行时动态创建代理对象。无论哪种方式,它们都为我们的代码带来了更高的复用性和可...

    Spring实现AOP的4种方式 - Java -

    下面我们将详细探讨Spring实现AOP的四种主要方式。 1. **基于注解的AOP** Spring框架自2.5版本开始支持基于注解的AOP,这种方式无需XML配置,更加简洁直观。开发者可以在方法上使用`@Aspect`、`@Before`、`@After`...

    aop思想的java代码实现

    在这个项目中,提供了三种AOP的实现方式: 1. **非AOP实现**:这个包可能包含了传统的编程方式,业务逻辑与横切关注点混合在一起,没有使用AOP的概念。这通常是AOP引入前的代码结构,便于对比和理解AOP的作用。 2....

    Java实现aop案例

    这篇博客文章《Java实现aop案例》可能详细介绍了如何在Java项目中使用Spring AOP来实现面向切面编程。虽然没有具体的描述,但我们可以根据标题推测文章可能会涵盖以下内容: 1. **AOP基本概念**:介绍AOP的核心概念...

    Spring实现AOP的4种方式

    本篇文章将详细探讨Spring实现AOP的四种主要方法:基于代理的方式、基于AspectJ的注解方式、基于XML的AOP配置以及基于Java的AOP配置。 1. 基于代理的实现 Spring的AOP支持两种代理类型:JDK动态代理和CGLIB代理。...

    Java JDK 实现AOP

    ### Java JDK 实现AOP详解 #### AOP的起源与发展 面向方面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,由施乐公司帕洛阿尔托研究中心(Xerox PARC)在20世纪90年代发明。AOP的初衷是为了更好地...

    注解+AOP优雅的实现java项目的接口参数校验(含源码)

    基于Spring boot + maven,以注解+AOP方式实现的java后端项目接口参数校验框架。迄今为止使用最简单、最容易理解的参数校验方案。博客地址:https://blog.csdn.net/weixin_42686388/article/details/104009771

    AOP四种配置方式demo

    AOP的四种配置方式主要包括:注解驱动、XML配置、编程式和自动代理。下面我们将详细讨论这四种方式。 1. **注解驱动**: 使用Java注解是最常见的AOP配置方式。在Spring中,我们可以在切面类上使用`@Aspect`注解...

    java分页 动态代理 aop实现

    Spring AOP主要通过两种方式实现: 1. 声明式AOP:基于注解的AOP,通过在方法上添加如`@Transactional`、`@AspectJ`等注解,Spring容器会在运行时自动织入切面逻辑。 2. 编程式AOP:使用`Aspect`和`Pointcut`定义切...

    AOP及其Java实现机制.doc

    ### AOP及其Java实现机制 #### 1. 引言 传统的编程技术通过分解的方式将一个复杂的软件系统拆分成相对较小、易于管理和理解的模块。然而,在实际开发过程中,一些跨模块的行为(如日志记录、事务管理等)难以封装...

    Spring实现AOP的四种方式

    本文将详细介绍Spring实现AOP的四种方式,包括基于代理的经典方式、@AspectJ注解驱动、纯POJO切面以及注入式AspectJ切面。 首先,理解AOP的基本概念: 1. **通知(Advice)**:通知定义了切面在何时执行,Spring支持...

    注解方式实现AOP编程

    在Spring框架中,AOP的实现有两种主要方式:一种是基于XML配置,另一种是基于注解。本篇将主要讨论如何通过注解方式来实现AOP编程。 首先,我们需要了解Spring中的核心注解。`@Aspect`是定义一个切面的注解,通常会...

    Spring AOP面向切面三种实现

    本文将详细解析Spring AOP的三种实现方式,帮助你深入理解这一重要概念。 首先,理解AOP的基本概念至关重要。AOP是一种编程范式,它允许开发者定义“切面”,即关注点的模块化,如日志、事务管理等。这些切面可以...

    使用Spring的注解方式实现AOP的细节

    在Spring框架中,面向切面编程(AOP)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限控制等,这些关注点可以被模块化并独立于业务逻辑进行处理。本篇文章将深入探讨如何通过Spring的注解...

    用Java动态代理实现AOP

    Java动态代理实现AOP Java动态代理是实现Aspect Oriented Programming(AOP)的重要手段。在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想...

    用java自己实现的动态代理 AOP

    总结来说,Java动态代理通过`Proxy`类和`InvocationHandler`接口提供了一种灵活的方式,能够在运行时创建代理对象并添加额外的行为,从而实现AOP的功能。开发者可以根据需求定义不同的`InvocationHandler`来实现各种...

    初探spring aop内部实现 java

    Spring AOP的实现主要依赖于两种技术:动态代理和AspectJ。对于接口,Spring使用Java动态代理(JDK Proxy)创建代理对象;而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在...

Global site tag (gtag.js) - Google Analytics