JAVA动态代理与AOP

2025-11-01 19:29:45

1、AOP就是面向切面编程,我们可以从以下几个层面来实现AOP

JAVA动态代理与AOP

2、在编译期修改源代码

在运行期字节码加载前修改字节码

在运行期字节码加载后动态创建代理类的字节码

1、以下是各种实现机制的比较:

JAVA动态代理与AOP

1、Joinpoint:拦截点,如某个业务方法

Pointcut:Joinpoint的表达式,表示拦截哪些方法。一个Pointcut对应多个Joinpoint

Advice:要切入的逻辑

Before Advice:在方法前切入

After Advice:在方法后切入,抛出异常则不会切入

After Returning Advice:在方法返回后切入,抛出异常则不会切入

After Throwing Advice:在方法抛出异常时切入

Around Advice:在方法执行前后切入,可以中断或忽略原有流程的执行

公民之间的关系

JAVA动态代理与AOP

2、织入器通过在切面中定义pointcout来搜索目标(被代理类)的JoinPoint(切入点),然后把要切入的逻辑(Advice)织入到目标对象里,生成代理类

1、动态代理

动态字节码生成

自定义类加载器

字节码转换

2、4.1 动态代理

静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了

动态代理:即在运行期动态创建代理类,使用动态代理实现AOP需要4个角色:

被代理的类:即AOP里所说的目标对象

被代理类的接口

织入器:使用接口反射机制生成一个代理类,在这个代理类中织入代码

InvocationHandler切面:切面,包含了Advice和Pointcut

JAVA动态代理与AOP

3、4.1.1 动态代理的演示

例子演示的是在方法执行前织入一段记录日志的代码,其中

Business是代理类

LogInvocationHandler是记录日志的切面

IBusiness、IBusiness2是代理类的接口

Proxy.newProxyInstance是织入器

JAVA动态代理与AOP

JAVA动态代理与AOP

JAVA动态代理与AOP

4、执行结果:

记录日志执行业务逻辑2执行业务逻辑

5、4.1.2 动态代理的原理

本节将结合动态代理的源代码讲解其实现原理

动态代理的核心其实就是代理对象的生成,即Proxy.newProxyInstance(classLoader, proxyInterface, handler)

让我们进入newProxyInstance方法观摩下,核心代码就三行:

JAVA动态代理与AOP

6、getProxyClass(loader, interfaces)方法用于获取代理类,它主要做了三件事情:

在当前类加载器的缓存里搜索是否有代理类

没有则生成代理

并缓存在本地JVM里

查找代理类getProxyClass(loader, interfaces)方法:

JAVA动态代理与AOP

7、生成加载代理类:

JAVA动态代理与AOP

8、代理类生成过程ProxyGenerator.generateProxyClass()方法的核心代码分析:

JAVA动态代理与AOP

9、通过以上分析,我们可以推出动态代理为我们生产了一个这样的代理类。把方法soSomeThing的方法体修改为调用LogInvocationHandler的invoke方法

代码如下:

JAVA动态代理与AOP

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢