`

AOP织入时机

 
阅读更多

对于AOP编程而言,程序的主要逻辑部分和Aspect功能部分的具体实现都可以采用传统的OO技术等实现,这里没有什么新东西。AOP最为特别并使其相对其他方法具有明显优点的部分就在于,它能够以多样的方式将程序中用到的多个方面灵活地织入(Weave)到一起,形成一个完整的应用程序。因而在学习AOP编程时,如何以准确、简洁、灵活的方式将各个不同的方面织入到一起,就成为了我们最需要注意的关键点。

大致上,织入操作可以发生在如下几个阶段。

编译时:在对源代码进行编译时,特殊的编译器允许我们通过某种方式指定程序中的各个方面进行Weave的规则,并根据这些规则生成编译完成的应用程序;

编译后:根据Weave规则对已经完成编译的程序模块进行Weave操作;

载入时:在载入程序模块的时候进行Weave操作;

运行时:在程序运行时,根据情况织入程序中的对象和方面。

在表2-1中列出了目前几种主流的AOP系统所支持的织入操作时机。

表2-1  AOP支持Weave时机列表

织入时机

AspectJ

Spring

JBoss

AspectC

编译时

 

 

编译后

 

 

加载时

 

运行时

 

 

 

选择合适的织入时机对于AOP应用来说是非常关键的。针对具体的应用场合,我们需要作出不同的抉择。可以看到,AspectJ为我们提供了最多的选择,即使没有直接支持的运行时Weave,也可以通过一个简单的模式来实现。在使用Spring或JBoss提供的AOP框架时,我们可以利用AspectJ来补足这两个框架的不足之处,从而获得更为灵活的织入策略。

下面来分析不同的织入时机的优缺点。

1.编译时Weave

编译时织入,即在编译Java源代码时,将Aspect源代码织入到Class代码中,如图2-2所示。

 
(点击查看大图)图2-2  编译时织入

对于普通应用程序而言,在编译时进行Weave操作是最为直观的做法。由于在源程序中包含了应用的所有信息,因此这种方式通常支持最多种类的联结点。利用编译时Weave,我们能够使用AOP系统进行细粒度的Weave操作,例如读取或写入字段。在源代码编译之后形成的模块将丧失大量的信息,因此通常采用粗粒度的AOP方法。同时,对于传统的编译成为本地代码的语言如C++、Fortran等来说,编译完成后的模块往往跟操作系统平台相关,这就给建立统一的编译后、载入时及运行时Weave机制造成了困难。对于编译成为本地代码的语言而言,只有在编译时进行Weave才最为可行。

尽管编译时Weave具有功能强大、适应面广泛等优点,但它的缺点也很明显。首先,它需要程序员提供所有的源代码,因此对于模块化的项目就有点力不从心了。即使能够提供所有模块的源代码,它也造成了程序不能进行增量编译、编译时间变慢等不利之处。

2.编译后Weave

编译后织入,即是将Aspect的源代码,织入到编译后的Class二进制代码中,以形成新的Class代码,如图2-3所示。

 
(点击查看大图)图2-3  编译后织入

为了解决模块化编程的要求,有些AOP框架开始支持编译后Weave的功能。程序员只需要获得编译完成之后的模块,就能进行Weave操作。在AspectJ中,不管是程序的主逻辑部分还是方面,都可以在先编译成为模块之后进行Weave,而且主逻辑部分完全可以采用普通的JavaC编译。而在AspectC中,进行编译后Weave的要求是所有的程序模块都采用AspectC进行编译。可以看出,使用Java这样基于虚拟机的语言对于编写AOP程序是有优势的。

3.加载时Weave

尽管编译后Weave已经解决了在不能获得所有源代码时进行AOP编程的需要的问题,但是在这个框架流行的时代,我们需要更为灵活地安排我们的Weave操作。如果程序的主逻辑部分和Aspect作为不同的组件开发,那么最为合理的Weave时机就是在框架载入Aspect代码之时。如果在进行载入时Weave,则Weave操作之后的结果将不会被保存。程序的主逻辑部分和Aspect部分可以分别进行开发和编译,而Weave操作则在程序载入时发生。

AspectJ、Spring和JBoss都支持载入时Weave。在Spring和JBoss的AOP实现中,框架先于应用程序启动,由框架来负责Weave操作的进行。而在AspectJ中,一个特殊的类加载器被用于这个目的。这个类加载器可以方便地嵌入到框架应用程序中,从而能够为任意的框架提供AOP支持。

4.运行时Weave

 

运行时Weave可能是所有Weave方式中最为灵活的,程序在运行过程中可以为单个的对象指定是否需要Weave特定的Aspect。在JBoss项目中,利用运行时Weave的特性完成了JBoss Cache项目。在JBoss Cache中,如果一个对象被放置到Cache中,它的状态就将被CacheAOP监视,并且它的状态会被自动同步到一个分布式的缓存中。如果这个对象不需要被缓存,那么它就和AOP不发生任何关系,对它的修改不会引发Cache的同步操作。值得一提的是,尽管AspectJ没有明确提供运行时Weave的能力,但在AspectJ中可以通过一个简单的Pattern实现来运行时Weave。

分享到:
评论

相关推荐

    简单spring aop 例子

    Spring支持三种织入时机:编译时、加载时和运行时。在本示例中,我们主要关注运行时织入,即在Spring容器启动时创建代理对象。 现在,我们来看如何创建一个简单的Spring AOP例子: 1. **定义切面(Aspect)**:切...

    Spring 入门案例——AOP

    4. **织入(Weaving)**:织入是将切面应用到目标对象的过程,Spring支持三种织入方式: - 编译时织入:使用AspectJ编译器将切面代码与目标类合并。 - 类加载时织入:使用特殊的类加载器,在目标类被加载到内存时...

    SpringAOP依赖包

    1. **spring-aop.jar**:这是Spring AOP的核心库,包含了AOP框架的实现,如代理创建、切面织入等功能。其中,`org.springframework.aop`包下提供了各种接口和类,如`AspectJExpressionPointcut`用于表达式匹配,`...

    模拟spring aop技术

    Spring支持三种织入方式:编译时织入、类加载时织入和运行时织入。 **二、模拟Spring AOP的步骤** 1. **定义切面**:创建一个类作为切面,其中包含通知方法。这些方法通常带有特定的注解,如`@Before`, `@After`, ...

    spring-aop实例

    Spring支持三种织入时机:编译时(使用AspectJ编译器)、加载时(使用AspectJ LTW)和运行时(由Spring容器处理)。 9. **应用场景**:Spring AOP常用于日志记录、事务管理、性能监控、安全性控制等。例如,你可以...

    spring-boot aop

    织入(Weaving)是将切面应用到目标对象以创建新的代理对象的过程,这在Spring中通常是自动完成的。 在Spring Boot项目中启用AOP,我们需要以下步骤: 1. **引入依赖**:在`pom.xml`或`build.gradle`文件中添加...

    aspectJ与XML配置的AOP

    而AspectJ则更加强大,它是一个完整的编译时和运行时AOP系统,可以进行字节码级别操作,提供更广泛的切面定义和织入时机。AspectJ支持静态织入,可以在编译时就将切面代码整合到目标类中,这使得应用的性能更好,但...

    spring aop 拦截实例

    Spring支持三种织入时机:编译时、类加载时和运行时。运行时织入是最常用的,通过代理模式实现,无需修改已编译的类。 在"spring aop 拦截实例"中,我们通常会看到以下步骤: 1. **配置AOP**:在Spring配置文件中...

    aspectjweaver-1.8.7和aopalliance1.0

    4. 织入(Weaving):AspectJ Weaver会自动将切面编织到目标类中,这个过程可以在编译时(静态织入)或运行时(动态织入)完成。 通过这样的组合,开发者可以优雅地处理那些横跨多个类的业务逻辑,同时保持核心业务...

    aop切面拦截单个方法实例

    Spring支持三种织入方式:编译时织入、加载时织入和运行时织入。Spring默认采用运行时织入,通过代理对象在运行时实现切面功能。 在实际应用中,我们可以创建一个切面类,比如`LoggingAspect`,其中包含一个`@...

    aopalliance-white-paper(AOP Alliance白皮书)

    - **织入(Weaving)**:将切面代码插入到应用程序中,可以在编译时或运行时进行。 #### 四、AOP Alliance 接口概览 AOP Alliance 定义了一系列接口,用于实现上述的核心概念: - **`org.aopalliance.intercept....

    aopalliance-1.0.0+aspectjrt+aspectjweaver

    它不仅支持编译时织入(在编译期间将切面代码与目标代码合并),还支持加载时织入(在类加载到JVM时进行织入)。AspectJ的语法丰富,可以定义切入点表达式,精确控制切面的生效时机。 最后,`aspectjweaver.jar`是...

    AOP技术总结 2

    根据织入时机的不同,可以分为静态织入和动态织入两种方式: - **静态织入**:在编译阶段将方面代码与主业务逻辑结合,通常需要使用特定的编译工具来实现。 - **动态织入**:在运行时将方面代码与主业务逻辑结合,...

    Aop.rar_aop_java aop

    Spring支持运行时织入和编译时织入。 **Spring AOP的实现方式** 1. **基于代理的AOP**:Spring默认使用JDK动态代理或CGLIB来创建代理对象。如果目标对象实现了接口,Spring会使用JDK动态代理;如果没有,它会使用...

    个人整理的关于AOP概念

    AOP的核心概念主要包括切面、连接点、通知、切入点、引入、目标对象、AOP代理以及织入,下面将逐一解析: 1. **切面(Aspect)**:切面是封装了横切关注点的模块,如事务管理。在Spring AOP中,切面可以通过基于模式...

    AOP总结

    在传统的面向对象编程中,这些系统服务通常通过在各个类或方法中插入相关代码来实现,而AOP则是把这些横切关注点抽取出来,形成独立的“切面”,然后在运行时动态地将切面织入到主业务逻辑中。 **AOP的核心概念** ...

    springaop

    运行时织入是在应用程序启动时完成的,而编译时织入则需要使用特殊工具,如AspectJ的编译器。 在描述中提到的博文链接(https://sungoshine.iteye.com/blog/1142144)可能提供了更深入的解释和示例,包括如何配置和...

    AOP的AspectJ实现方案来做语言切换

    在AOP的实现方式中,AspectJ是最强大且功能丰富的,尽管它的学习曲线相对陡峭,但其强大的编译时织入和运行时织入能力使其成为专业开发者的首选。 AspectJ是一个独立的AOP框架,它提供了一种静态类型的、基于Java的...

    aop的详细总结(包含例子)

    2. 动态织入:运行时进行,Spring AOP属于此类,又分为静态和动态两种形式。 三、Spring AOP代理原理 Spring AOP通过两种类型的代理来实现: 1. JDK动态代理:适用于目标对象实现了接口的情况,性能较低,需要定义...

    五、Spring源码分析——Spring Aop

    Spring支持三种织入时机:编译时(使用AspectJ编译器)、加载时(使用AspectJ LTW)和运行时(Spring容器初始化时)。 7. **源码分析**: 在Spring AOP的源码中,`org.springframework.aop.framework....

Global site tag (gtag.js) - Google Analytics