今天使用Spring时,我想模仿AOP来实现相应的代理,但是它会触发beannotofrequiredtypexception pecception异常,因为春季将执行类验证。
因此,我突然变得好奇,决定学习,如何避免这种验证过程。
JDK代理和CGLIB之间的区别
一个普遍讨论的问题,询问完整性(单词数)或放任:
PS:配置可以
常规方法是CGLIB,因此仍以这种方式分析主流过程。通过补充预知,猜测是由于CGLIB的特征,实际上已被验证。
看到拦截入口,然后您必须查看如何通过后处理器在AOP中处理它。首先,查看后处理器链接列表
步骤1:当对象A中的字段是@Autowired注入的AOP代理类
目前,我们可以找到在DefaultListableBeanFactory#doreolvePendency链接中,将获得代理类的对象。获得的对象如下图所示:
步骤2:判断班级的关系
步骤3:判断班级关系的逻辑
这表明CGLIB创建的对象符合条件:相同或超级或覆盖
回去这里查看以前的问题,这很简单:
然后,继续审查CGLIB的创建过程,实际上,在汇编的结果中,您可以直观地看到代理的对象:
关于CGLIB的基础,您可以看到CGLIB(代码生成库)的简介和原理。
FastClass的角色
fastClass是每种方法的数字,并通过数字找到该方法,以便可以避免效率
CGLIB将生成2个快速阶级:
原因:CGLIB代理是基于继承的,公共和最终方法不能在父类中继承,因此需要父母类的快速班级
FastClass有两种主要方法:
eNchance对象
在此之前,我了解到CGLIB通过重写字节代码生成主类来生成代理的目的。让我们看一下原始方法被重写的内容
您还可以在这里看到映射关系