Cglib是一个高效的动态代理方式,并且在SpringBoot中默认的代理实现方式。
本片文章会分析Cglib是如何生成代理对象、代理对象如何执行相应的目标函数、及和jdk代理有什么区别。validatedClasses 是静态容器,是对在系统中所有通过cglib创建的目标对象中是否有final method的检查。因为Cglib代理在继承目标对象时要复写所有函数,不可以复写final修饰的函数。
在构建代理对象时通过通知规则来配置。这个通知规则包含了通知器和通知方法。
@Override
public Object getProxy(@Nullable ClassLoader classLoader) {
try {
// 取到通知规则中要被代理的目标对象的 Class对象,由于要继承所以不能为空
Class<?> rootClass = this.advised.getTargetClass();
Assert.state(rootClass != null, "Target class must be available for creating a CGLIB proxy");
Class<?> proxySuperClass = rootClass;
// 如果目标对象是一个Cglib的对象,会去拿它的父类对象,这个对象一定是真正的目标对象
if (ClassUtils.isCglibProxyClass(rootClass)) {
proxySuperClass = rootClass.getSuperclass();
// 另外还拿到目标对象一堆接口,收集起来后面有用
Class<?>[] additionalInterfaces = rootClass.getInterfaces();
for (Class<?> additionalInterface : additionalInterfaces) {
this.advised.addInterface(additionalInterface);
}
}
// 这里会去检查目标对象的final method,以及当前classLoader可不可以加载到这个目标对象,先去看这个方法
validateClassIfNecessary(proxySuperClass, classLoader);
// 这一步是直接new个增强器出来
Enhancer enhancer = createEnhancer();
if (classLoader != null) {
enhancer.setClassLoader(classLoader);
if (classLoader instanceof SmartClassLoader &&
((SmartClassLoader) classLoader).isClassReloadable(proxySuperClass)) {
enhancer.setUseCache(false);
}
}
// 给增强器配置一些参数,目标对象、目标接口、命名策略(BySpringCGLIB)
enhancer.setSuperclass(proxySuperClass);
enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised));
enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
enhancer.setStrategy(new ClassLoaderAwareUndeclaredThrowableStrategy(classLoader));
// 拿到所有的回调对象,主要就是aop的通知拦截器,目标对象方法拦截器(MethodInteceptor)
Callback[] callbacks = getCallbacks(rootClass);
Class<?>[] types = new Class<?>[callbacks.length];
for (int x = 0; x < types.length; x++) {
types[x] = callbacks[x].getClass();
}
// fixedInterceptorMap only populated at this point, after getCallbacks call above
enhancer.setCallbackFilter(new Prox

本文深入探讨了CGLib在SpringBoot中的代理实现方式,分析了其生成代理对象的过程,包括检查目标类的final方法、创建增强器、配置回调规则等步骤。CGLib通过继承目标类并复写非final方法来实现代理,利用MethodInterceptor接口进行方法拦截。当调用代理对象的方法时,会执行拦截器逻辑,从而实现AOP的功能。此外,文章还对比了CGLib与JDK代理的区别。


最低0.47元/天 解锁文章
9907

被折叠的 条评论
为什么被折叠?



