首页 > 其他分享 >EnhancerByCGLIB和EnhancerBySpringCGLIB代理

EnhancerByCGLIB和EnhancerBySpringCGLIB代理

时间:2024-10-29 10:12:18浏览次数:6  
标签:Spring EnhancerBySpringCGLIB 代理 EnhancerByCGLIB method CGLIB AOP public

$$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 应用中。

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

标签:Spring,EnhancerBySpringCGLIB,代理,EnhancerByCGLIB,method,CGLIB,AOP,public
From: https://www.cnblogs.com/auv2009/p/18512294

相关文章

  • nginx 根路径同时代理 http ws sse 三种请求
    HTTP(HyperTextTransferProtocol):超文本传输协议,是用于在客户端(通常是web浏览器)和服务器之间传输数据的协议。HTTP是Web的基础,用于请求和传输网页、图像、视频等资源。它采用请求-响应模型,支持多种方法(如GET、POST等),并可通过HTTP/1.1和HTTP/2等版本进行优化,以提高性能和用户体验。......
  • 如何在麒麟操作系统上进行网络代理和防火墙的设置
    ​在麒麟操作系统中设置网络代理及防火墙配置步骤:一、初始化网络代理设置;二、配置防火墙策略;三、检测与调试;四、常见问题及解决方法;五、网络安全建议。麒麟操作系统作为一款受到关注的国产操作系统,网络安全与代理设置同样显得尤为重要。一、初始化网络代理设置首先,我们需要进......
  • 后台提醒与代理提醒:HarmonyOS Next 的智能提醒管理
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在移动应用开发中,及时有效的提醒功能对......
  • nginx 代理 minio
    nginx.confupstreamminio_s3{least_conn;serverminio-01.internal-domain.com:9000;serverminio-02.internal-domain.com:9000;serverminio-03.internal-domain.com:9000;serverminio-04.internal-domain.com:9000;}upstreamminio_console{......
  • 反射、代理简单理解
    反射反射允许对成员变量,成员方法和构造方法的信息进行编程访问但是获取不是从类里面获取的,是从类的字节码(.class)文件中获取的,所以我们首先要学习如何获取类的class对象。在Java中,定义好了一个类Class,就是用来描述字节码文件的获取class对象的三种方式  1.Class.forna......
  • IIS使用反向代理,解决路径包含特殊字符无法访问的问题
    环境:操作系统:WindowsServer2019IIS版本:10问题试用Nocobase的时候,遇到400BadRequest的报错。 直接访问的话,报错页面是非常常见的RuntimeError。诡异这个问题,在开发端(Windows11)的IIS中不会出现。同样的IIS版本。解决办法先说结论,时间比较赶的朋友直接试这个就可以......
  • 什么是云访问安全代理(CASB)
    云访问安全代理(CASB)是一种位于企业和云服务提供商之间的安全工具,用于监控、控制和保护企业在云环境中的数据和应用。CASB可以作为中间层,帮助企业实现对云服务的可见性、数据安全性、合规性和访问控制等管理功能。一、CASB概述云计算和云服务的广泛应用使得企业和组织能够以更......
  • 取消配置此主机上的 vSphere HA 代理时出错。要解决此问题,请将主机重新连接到 vCenter
    点选受影响主机,右键-重新配置vSphereHA,自动恢复HA......
  • [Go] 如何妥善处理 TCP 代理中连接的关闭
    如何妥善处理TCP代理中连接的关闭相比较于直接关闭TCP连接,只关闭TCP连接读写使用单工连接的场景较少,但通用的TCP代理也需要考虑这部分场景。背景今天在看老代码的时候,发现一个TCP代理的核心函数实现的比较粗糙,收到EOF后直接粗暴关闭两条TCP连接。funcConnCat(u......
  • 代理模式
    代理设计模式首先为什么单独介绍这个设计模式,因为这个设计模式实现了SpringAoP的底层原理,后续在Spring的文章中我会提到设计模式回顾模式的起源模式是在特定环境下解决某类重复出现问题的一套成功或有效的解决方案。每个模式是在特定的环境下才有效,学习模式,除了了解模式本身......