Java AOP的实现原理

本文介绍了Java中的AOP(面向方面编程),它作为OOP的补充,主要用于解决横切关注点的问题。文章详细讲解了AOP代理的两种形式——静态代理(AspectJ)和动态代理(Spring AOP)。AspectJ在编译时增强,生成AOP代理类,而Spring AOP在运行时通过JDK或CGLIB动态生成代理对象,实现了对目标方法的增强处理。
摘要由CSDN通过智能技术生成

一、什么是AOP#
AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

二、AOP代理#

1.AOP实现的关键,在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。

2.使用AspectJ的编译时增强,实现AOP。

之前提到,AspectJ是静态代理的增强。所谓的静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强。

3.举个实例来说。首先我们有一个普通的Hello类:

Copy
public class Hello {
public void sayHello() {
System.out.println(“hello”);
}
public static void main(String[] args) {
Hello h = new Hello();
h.sayHello();
}
}

4.使用AspectJ编写一个Aspect:

Copy
public aspect TxAspect {
void around:call(void Hello.sayHello()) {
System.out.println(“开始事务。。。”);
proceed();
System.out.println(“结束事务。。。”);
}
}

5.这里模拟了一个事务的场景,类似于Spring的声明式事务。使用AspectJ的编译器编译:

ajc -d . Hello.java TxAspect.aj

编译完成之后,再运行Hello类,可以看到以下输出:

1)开始事务。。。
2)hello
3)结束事务。。。

Java AOP(面向切面编程)实现原理是利用动态代理技术,通过在对象的方法执行前或执行后,或者在抛出异常时,通过切面切入到被代理方法进行增强操作,实现业务逻辑与横切逻辑的分离,并使得横切逻辑在代码得以复用。 例如,我们通过使用注解或 XML 文件配置切面,在程序运行时利用织入技术动态地将切面织入到被代理对象的方法,然后在执行被代理方法之前或之后,执行切面的操作,比如日志记录、异常处理、性能统计等。 这种实现方式可以通过 JDK 自带的动态代理或者 CGLIB 等第三方的字节码技术实现。在 JDK 动态代理方式下,AOP 框架会在运行时生成代理类,在代理类实现切面逻辑,在代理类调用被代理对象的方法。在 CGLIB 方式下,AOP 框架可以动态生成一个继承自被代理对象的子类,在子类实现切面逻辑,并且也进行了重写被代理对象的方法。 注意,AOP实现原理并不是将切面代码插入到被代理对象的字节码,而是通过字节码增强技术生成新的类来完成代码的织入操作,这样可以防止修改原有代码的安全问题,也可以保持代码的整洁性和可读性。 综上所述,Java AOP实现原理是通过动态代理或字节码增强技术,在被代理方法的前后或异常抛出时,在程序运行时动态地将切面织入到被代理对象的方法,实现业务逻辑和横切逻辑的分离,提高代码的可重用性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值