$$EnhancerByCGLIB
和 $$EnhancerBySpringCGLIB
是由两个不同的库生成的 Java 字节码代理类的命名后缀。尽管两者都与 CGLIB(Code Generation Library)有关,但它们有一些重要的区别。
CGLIB 代理简介
CGLIB 是一个开源的字节码生成库,允许在运行时动态创建类和对象。它最著名的用途是创建 Java 代理,这些代理类能够在不修改源代码的情况下增强现有类的功能。
$$EnhancerByCGLIB
- 使用此后缀的类是由原始的 CGLIB 库生成的:
- 当你直接使用 CGLIB 库(如
cglib:3.2.0
)进行类增强时,生成的代理类通常会包含$$EnhancerByCGLIB
后缀。
- 当你直接使用 CGLIB 库(如
- 应用场景:
- 使用 CGLIB 创建代理类来拦截方法调用,实现 AOP(面向切面编程)功能,或增强现有类的行为,比如添加日志、事务等。
- 示例代码:
- 使用 CGLIB 创建一个代理类:
1 Enhancer enhancer = new Enhancer(); 2 enhancer.setSuperclass(TargetClass.class); 3 enhancer.setCallback(new MethodInterceptor() { 4 @Override 5 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { 6 // 方法调用前增强 7 System.out.println("Before method call: " + method.getName()); 8 Object result = proxy.invokeSuper(obj, args); // 调用原方法 9 // 方法调用后增强 10 System.out.println("After method call: " + method.getName()); 11 return result; 12 } 13 }); 14 TargetClass proxy = (TargetClass) enhancer.create(); 15 proxy.someMethod(); // 调用代理类的方法
$$EnhancerBySpringCGLIB
- 此后缀的类是由 Spring 框架生成的:
- Spring 使用了 CGLIB 库来创建代理类,并添加了
Spring
前缀生成的代理类后缀,从而区别于原始的 CGLIB 。
- Spring 使用了 CGLIB 库来创建代理类,并添加了
- 应用场景:
- 使用 Spring AOP 进行方法拦截和增强。 Spring AOP 的默认实现是基于动态代理(JDK 动态代理和 CGLIB)。当目标类没有实现目标接口时,Spring AOP 会使用 CGLIB 生成代理类。
- 示例代码:
- 使用 Spring AOP 创建一个代理类:
1 @Component 2 public class MyService { 3 public void performAction() { 4 System.out.println("Performing action"); 5 } 6 } 7 8 @Aspect 9 @Component 10 public class MyAspect { 11 @Before("execution(* com.example.MyService.performAction(..))") 12 public void beforeAdvice(JoinPoint joinPoint) { 13 System.out.println("Before method call: " + joinPoint.getSignature().getName()); 14 } 15 16 @After("execution(* com.example.MyService.performAction(..))") 17 public void afterAdvice(JoinPoint joinPoint) { 18 System.out.println("After method call: " + joinPoint.getSignature().getName()); 19 } 20 } 21 22 @SpringBootApplication 23 public class MyApplication { 24 public static void main(String[] args) { 25 ConfigurableApplicationContext context = SpringApplication.run(MyApplication.class, args); 26 MyService myService = context.getBean(MyService.class); 27 myService.performAction(); // 代理对象调用方法 28 } 29 }
区别总结
-
生成库:
$$EnhancerByCGLIB
由 CGLIB 库生成。$$EnhancerBySpringCGLIB
由 Spring 框架使用 CGLIB 库生成,并在类名后缀中添加了Spring
以示区别。
-
应用场景:
$$EnhancerByCGLIB
通常用于直接使用 CGLIB 来创建代理类。$$EnhancerBySpringCGLIB
通常用于 Spring AOP 代理类的生成和增强。
-
配置和使用难易度:
- 直接使用 CGLIB 需要手动编写代码去增强类及其方法。
- 使用 Spring AOP 则更简化,通过配置注解或 XML 就可以实现复杂的增强行为,且更易于集成到 Spring 应用中。
通过理解这两个后缀的区别,你可以更好地根据项目需要选择合适的增强手段,并清楚了解背后的动态代理机制。