Java 平台上 AOP 的实现机制
1. 动态代理
JDK1.3之后,引入了动态代理 (Dynamic Proxy)机制,可以在运行期间,为相应的接口(Interface)动态生成对应的代
理对象,所以可以将横切关注点逻辑封装到动态代理的 InvocatioHandler 中,然后在系统运行期间,根据横切关注点需要织
入的模块位置,将横切逻辑织入到相应的代理类中。 以动态代理类为载体的横切逻辑,现在当然就可以与系统的其他模块一起
工作了。
缺点或是优点:所有需要织入横切关注点逻辑的模块类都得实现响应的接口,因为动态代理机制只针对接口有效。
Spring AOP 默认情况下采用这种机制实现 AOP 机能。
2. 动态字节码增强
Java虚拟机加载的 Class 文件都是符合一定规范的,所以,只要交给 Java 虚拟机运行的文件符合 Java Class 规范,
程序的运行就没有问题。 通常的 class 文件都是从 Java 源代码文件只用 Javac 编译器编译而成的,但是只要符合 Java
class 规范,也可以使用 ASM 或者 CGLIB 等 Java 工具库,在程序运行期间,动态构建字节码的 class 文件
在这样的前提下,可以为需要织入横切逻辑的模块类在运行期间,通过字节码增强技术,为这些系统系统模块类生成
相应的子类,而将横切逻辑加到这些子类中,让应用程序在执行期间使用的是这些动态生成的子类,从而达到将横切逻辑
织入系统的目的。
优点:即使模块类没有实现相应的接口,依然可以对其进行扩展,而不用像动态代理那样受限于接口。
缺点:如果需要扩展的类以及类中的实例方法声明为 final ,则无法对其进行子类化扩展
Spring AOP 在无法采用动态代理机制进行 AOP 功能扩展的时候,会使用 CGLIB 库的动态字节码增强支持来实现 AOP 的功能扩展
3. Java 代码生成 (早期 EJB 使用,现在已经退休了)
大概就是 EJB 容器根据部署描述符文件提供的织入信息,会为相应的功能模块类生成对应的 Java 代码,然后通过部署工具编译 Java 代码生成相应的 Java 类。之后,部署到 EJB 容器的功能模块就可以正常工作了。
4. 自定义类加载器
所有的 Java 程序的 class 都要通过相应的 类加载器 (Classloader)加载到 Java 虚拟机之后才可以运行。默认的
类加载器会读取 class 字节码文件,然后按照 class 字节码规范,解析并加载这些 class 文件到虚拟机运行。如果能够在
这个 class 文件加载到虚拟机运行期间,将横切逻辑织入到 class 文件的话,就可以完成 AOP 与 OOP 的融合了。
可以通过自定义类加载器的方式完成横切逻辑到系统的织入,自定义类加载器通过读取外部文件规定的织入规则和必要
信息,在加载 class 文件期间就可以将横切逻辑添加到系统模块的现有逻辑中,然后将改动后的 class 交给 Java 虚拟机
运行。
优点: 可以对大部分类以及相应的实例进行织入,功能与之前的集中方式相比当然强大很多。
缺点: 最大的问题就是 类加载器 本身的使用。某些应用服务器会控制整个类加载体系,所以,在这样的场景下使用可能会造成一定的问题。
JBoss AOP 和 AspectWerkz 框架都是采用自定义类加载器的方式实现, Spring AOP 未采用该方式。
5. AOL 扩展
AOL 扩展是最强大,也最难掌握的一种方式,,AspectJ 就属于这种方式。AOP的各种概念在 AOL 中大都有一一对应的
实体。 可以使用扩展过的 AOL, 实现任何 AOP 概念实体甚至 OOP 概念实体, 比如 Aspect 以及 Class。 所有的
AOP 概念在 AOL 中得到了最完美的表达。
缺点: 该方式强大的代价就是,需要重新学习一门扩展了旧有语言的 AOL 或者全新的 AOL 语言。
S
pring AOP 未采用该方式
分享到:
相关推荐
Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...
AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析...
**Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...
《Spring AOP 源码分析》 在深入探讨Spring AOP之前,我们先要理解AOP(面向切面编程)的基本概念。AOP是一种编程范式,它将关注点分离,使得我们可以将横切关注点(如日志、事务管理、安全检查等)与业务逻辑解耦...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和抽象化的方法来处理系统中的交叉关注点,如日志、事务管理、安全性等。本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际...
在本文中,我们将从实现的角度来认识 SpringAOP 框架,从外部接口、内部实现、组成部分、执行过程四个方面来介绍 Spring AOP 框架的结构分析。 最后,本文的目标是从实现的角度来认识 SpringAOP 框架,观察的角度是...
2. **性能监控**:记录方法执行时间,用于性能分析和优化。 3. **安全控制**:检查权限,防止未经授权的访问。 4. **日志记录**:记录操作信息,便于追踪和调试。 5. **缓存管理**:在方法调用前检查是否有缓存...
2. spring-aop-4.1.6.RELEASE.jar:这是Spring AOP的特定版本,这里的4.1.6.RELEASE是Spring框架的一个稳定版本。Spring AOP模块提供了实现AOP规范的功能,它允许开发者定义“切面”来封装系统中的横切关注点,如...
在本文中,我们将深入探讨Spring AOP的运用,并结合源码分析其工作原理。 首先,了解AOP的基本概念: 1. 切面(Aspect):切面是关注点的模块化,这些关注点通常是跨越多个对象的横切关注点,例如事务管理、日志...
Spring AOP,全称Aspect-Oriented Programming,是Spring框架中的一个重要组成部分,它引入了面向切面编程的概念,使得开发者可以将关注点分离,更好地实现业务逻辑与系统服务的解耦。在这个经典例子中,我们将深入...
2. **XML配置的AOP**:在传统的Spring配置中,我们需要在`<aop:config>`元素内定义切面、切入点和通知。虽然相比注解方式繁琐,但在某些情况下更具有灵活性。 压缩包中的`SpringAOPTest`可能包含了一个Spring AOP的...
本篇文章将深入探讨如何使用Spring AOP实现性能监控器,并通过源码分析来理解其工作原理。 首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入...
**Spring AOP 使用实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不修改原有代码的情况下,通过代理方式添加额外功能的技术。这种技术使得我们...
在提供的压缩包文件"springAOP"中,可能包含了以下内容: - **切面类(Aspect Class)**:包含切点和通知的Java类,可能使用了`@Aspect`注解。 - **目标类(Target Class)**:被AOP代理的对象,通常包含业务逻辑。...
Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它允许开发者将横切关注点与业务逻辑分离,实现业务逻辑的模块化。AOP核心组件包括几个关键概念,如切面(Aspect)、通知(Advice)、连接点(Joinpoint...
2. spring-beans.jar:Spring的bean容器,负责管理和装配应用的bean,它是Spring框架的基础。 3. spring-core.jar:Spring的核心库,提供了基本的IoC(Inversion of Control,控制反转)功能和核心工具类。 4. ...
2. 配置Spring的XML配置文件,声明AOP的相关bean,包括切面类和通知。 3. 使用`@Aspect`注解标记切面类,并在类中定义通知方法。 4. 使用`@Before`、`@After`、`@Around`、`@AfterReturning`、`@AfterThrowing`等...
Spring AOP 源码分析笔记 Spring AOP(Aspect-Oriented Programming)是一种编程范式,它允许开发者 modularize cross-cutting concerns,即将横切关注点模块化。AOP 使得开发者可以将一些公共的功能模块化,以便在...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点...