$$EnhancerByCGLIB 和 $$EnhancerBySpringCGLIB 是由两个不同的库生成的 Java 字节码代理类的命名后缀。尽管两者都与 CGLIB(Code Generation Library)有关,但它们有一些重要的区别。

CGLIB 代理简介

CGLIB 是一个开源的字节码生成库,允许在运行时动态创建类和对象。它最著名的用途是创建 Java 代理,这些代理类能够在不修改源代码的情况下增强现有类的功能。

$$EnhancerByCGLIB

  • 使用此后缀的类是由原始的 CGLIB 库生成的
    • 当你直接使用 CGLIB 库(如 cglib:3.2.0)进行类增强时,生成的代理类通常会包含 $$EnhancerByCGLIB 后缀。
  • 应用场景
    • 使用 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 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 }

 

区别总结

  1. 生成库

    • $$EnhancerByCGLIB 由 CGLIB 库生成。
    • $$EnhancerBySpringCGLIB 由 Spring 框架使用 CGLIB 库生成,并在类名后缀中添加了 Spring 以示区别。
  2. 应用场景

    • $$EnhancerByCGLIB 通常用于直接使用 CGLIB 来创建代理类。
    • $$EnhancerBySpringCGLIB 通常用于 Spring AOP 代理类的生成和增强。
  3. 配置和使用难易度

    • 直接使用 CGLIB 需要手动编写代码去增强类及其方法。
    • 使用 Spring AOP 则更简化,通过配置注解或 XML 就可以实现复杂的增强行为,且更易于集成到 Spring 应用中。

通过理解这两个后缀的区别,你可以更好地根据项目需要选择合适的增强手段,并清楚了解背后的动态代理机制。

posted on 2024-10-29 10:13  卡米i  阅读(60)  评论(0编辑  收藏  举报