JAVA动态代理与AOP

2024-10-14 23:55:02

动态代理在运行期通过接口动态生成代理类,这为其带来了一定的灵活性,

工具/原料

AOP的JAR包

eclipse

1、AOP的各种实现

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

JAVA动态代理与AOP

2、在编译期修改源代码在运行期字节码加载前修改字节码在运行期字节码加载后动态创建代理类的字节码

2、AOP各种实现机制的比较

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

JAVA动态代理与AOP

3、AOP里的公民

1、Joinpoint:拦截点,如某个业务方法Pointcut:Joinpoint的表达式,表示拦截哪些方法。一个Pointcut对应多个Joi荏鱿胫协npointAdvice:要切入的逻辑Before Advice:在方法前切入After Advice:在方法后切入,抛出异常则不会切入After Returning Advice:在方法返回后切入,抛出异常则不会切入After Throwing Advice:在方法抛出异常时切入Around Advice:在方法执行前后切入,可以中断或忽略原有流程的执行公民之间的关系

JAVA动态代理与AOP

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

4、AOP的实现机制

1、动态代理动态字节码生成自定义类加载器字节码转换

2、1 动漤逗庞俄态代理静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.艘早祓胂class文件就已经存在了动态代理:即在运行期动态创建代理类,使用动态代理实现AOP需要4个角色:被代理的类:即AOP里所说的目标对象被代理类的接口织入器:使用接口反射机制生成一个代理类,在这个代理类中织入代码InvocationHandler切面:切面,包含了Advice和Pointcut

JAVA动态代理与AOP

3、1.1 动态代理的演示例子演示的是在方法执行前织入一段记录日志的代码,其中Business是代理类LogInvocationHandler是记录日志的切面IBusiness、IBusiness2是代理类的接口Proxy.newProxyInstance是织入器

JAVA动态代理与AOPJAVA动态代理与AOPJAVA动态代理与AOP

4、执行结果:记录日志执行业务逻辑2执行业务逻辑

5、1.2 动态代理的原理本节将结合动态代理的源代码讲解其实现原理动态代理的核心其实就是代理对象的生成,即Proxy.newProxyInstance(class讣嘬铮篌Loader, 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
猜你喜欢