在AOP中Spring生成代理类的两种方式
作者:李灿辉 发布时间:2023-12-08 19:13:36
Java * 。具体有如下四步骤:
通过实现 InvocationHandler 接口创建自己的调用处理器;
通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建 * 类;
通过反射机制获得 * 类的构造函数,其唯一参数类型是调用处理器接口类型;
通过构造函数创建 * 类实例,构造时调用处理器对象作为参数被传入。
在AOP中,Spring通过生成代理类,来完成切面的织入。
Spring生成代理类有2种方式。
如果目标对象实现的是一个接口,Spring会使用JDK的java.lang.relect.Proxy类,它允许Spring动态生成一个新接口,来实现必要的接口,织入任何通知,并且把对这些接口的任何调用转发到目标类。
如果目标类没有实现一个接口,Spring就使用CGLIB库生成目标类的一个子类,在创建这个子类时,Spring织入通知,并且把对这个子类的调用转发到目标类。在使用这种方式时需要注意一点,被标记为final的方法不能被通知,因为Spring创建的子类无法重写父类的final的方法。
原理区别:
java * 是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib * 是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
1、如果目标对象实现了接口,默认情况下会采用JDK的 * 实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK * 和CGLIB之间转换
来源:https://blog.csdn.net/li_canhui/article/details/85253201
猜你喜欢
- 简介之前在项目中遇到了一个新需求,领导让我使用本地缓存,来缓存数据库查出的用户信息,经过一番资料查阅和实验,最终确定了使用Caffeine来
- 1、安装依赖<dependency> <
- 接触过Android开发的同学们都知道在Android中访问程序资源基本都是通过资源ID来访问。这样开发起来很简单,并且可以不去考虑各种分辨
- 1、引入依赖<dependency> <groupId>org.apache.pdfbox</gr
- 若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的。 通常情况下, 静
- 避免多线程同时读写共享数据在实际开发中,难免会遇到多线程读写共享数据的需求。比如在某个业务处理时,先获取共享数据(比如是一个计数),再利用共
- java 中死锁问题的实例详解先看代码在做解释public class DeadLock implements Runnable{ &nbs
- Struts2Struts2是在WebWork2基础发展而来的。和struts1一样, Struts2也属于MVC框架。不过有一点
- Java集合删除元素ArrayList实例详解AbstractCollection集合类中有一个remove方法,该方法为了适配多种不同的集
- 本文实例为大家分享了Android TextView实现跑马灯效果的具体代码,供大家参考,具体内容如下当Layout中只有一个TextVie
- 前言为了减少日志频繁打印带来的性能影响,线上环境设置的日志级别一般都相对较高。而当出现生产问题需要排查的时候,可能需要适当降低日志级别(例如
- 前言在手写sql的时候,根据参数处理查询条件.select * from staff where 1 = 1 and staff_id in
- 机器跑了一晚上,发现有崩溃现象,由于页面内有动态绘图功能,我怀疑是绘图原因,但是今天上午有人提醒我才想到,是不是间隔调用时DWR产生了内存泄
- 摘要本文主要讲解mall整合SpringTask的过程,以批量修改超时订单为例。SpringTask是Spring自主研发的轻量级定时任务工
- Java main 方法面试题的详细整理1.不用main方法如何定义一个类?不行,没有main方法我们不能运行Java类。在java 7之前
- 1、接口:一种把类抽象的更彻底,接口里只能包含抽象方法的“特殊类”。接口不关心类的内部状态数据,定义的是一批类所遵守的规范。(它只规定这批类
- webservice的POST和GET请求调用POST请求1.发送请求import java.io.DataOutputStream;imp
- 一、简介ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:Task支持线程的
- 1、CyclicBarrier:一个同步辅助类,用于协调多个子线程,让多个子线程在这个屏障前等待,直到所有子线程都到达了这个屏障时,再一起继
- System.out.print("\b") 会在控制台下往回删掉一个字符,如果你想回删多个字符就打印多个 "