首页 > 其他分享 >Spring Boot代理问题

Spring Boot代理问题

时间:2024-11-04 18:16:03浏览次数:5  
标签:Spring Boot 代理 接口 CGLIB import org

在 Spring Boot 2.x 中,AOP(面向切面编程)默认使用 CGLIB(Code Generation Library)来实现类的代理。CGLIB 代理是通过在运行时生成目标类的子类来增强目标类的方法。这种方式允许对没有实现接口的类进行代理。以下是一些原因和机制解释,说明为什么 Spring 在 AOP 中默认使用 CGLIB。

为什么默认使用 CGLIB

  1. 可用性和兼容性

    • 不依赖于接口:CGLIB 代理不需要目标类实现接口,因此它可以代理任何类,包括那些没有实现接口的类。这在某些情况下非常方便和必要。
    • Spring 选择的默认策略:由于 CGLIB 代理在更多场景中更为通用和强大,因此它被设置为默认的代理方式。
  2. 避免困惑

    • 一致性:使用 CGLIB 可以避免开发人员在决定是否需要实现接口时遇到的困惑。无论类是否实现接口,都可以使用相同的代理机制。
  3. 性能

    • 性能优化:CGLIB 的性能已经过优化,足以满足大多数企业级应用的需求。虽然 JDK 动态代理在某些情况下可能略快,但差异通常对最终用户应用程序的性能没有显著影响。

Spring AOP 代理机制

Spring AOP 支持两种主要的代理模式:

  1. JDK 动态代理

    • 依赖于 java.lang.reflect.Proxy,只能对实现了一个或多个接口的类进行代理。
    • 适用于所有实现接口的类。
  2. CGLIB 代理

    • 使用 net.sf.cglib.proxy 包进行代理,通过生成目标类的子类来实现方法增强。
    • 适用于没有实现接口的类,或者可以覆盖具体类的方法以实现更广泛的应用。

如何配置代理类型

虽然 Spring 默认使用 CGLIB,但开发人员可以通过配置来控制代理类型。使用 @EnableAspectJAutoProxy 注解可以指定代理方式:

  • 默认代理设置(通常是 CGLIB):
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
}

复制

  • 强制使用 CGLIB 代理
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class AppConfig {
}

复制

  • 强制使用 JDK 动态代理(仅对实现接口的类有效):
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass=false)
public class AppConfig {
}

复制

自动代理选择机制

Spring 会基于以下规则自动选择适合的代理机制:

  1. 如果目标类实现了至少一个接口,并且 proxyTargetClass 设置为 false

    • Spring 使用 JDK 动态代理。
  2. 如果目标类没有实现任何接口,或者 proxyTargetClass 设置为 true

    • Spring 使用 CGLIB 代理。

使用 AOP 的常见配置和限制

  1. 非公开方法

    • CGLIB 可以代理非公共方法(protectedpackage-private 和 private),而 JDK 动态代理只能代理公共接口的方法。
  2. 构造函数代理

    • CGLIB 在生成子类时会覆盖构造函数,而 JDK 动态代理则不涉及构造函数。

示例代码

以下是一个使用 CGLIB 代理的示例:

定义目标类(没有实现任何接口)
import org.springframework.stereotype.Component;

@Component
public class MyService {

    public void doSomething() {
        System.out.println("Doing something...");
    }
}
定义切面类
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyAspect {

    @Before("execution(* com.example.MyService.doSomething(..))")
    public void beforeDoSomething() {
        System.out.println("Before advice is being applied...");
    }
}
配置类
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true) // 强制使用 CGLIB 代理
public class AppConfig {
}

总结

Spring Boot 2.x 默认使用 CGLIB 来实现 AOP 代理,主要是因为 CGLIB 适用于更广泛的场景,包括那些没有实现接口的类。此外,Spring 允许通过配置来选择和控制代理类型,以适应特定应用程序的需求和设计。

了解这些机制和配置选项,有助于开发人员在使用 Spring AOP 时做出更明智的选择,并确保代理行为符合预期。

标签:Spring,Boot,代理,接口,CGLIB,import,org
From: https://blog.csdn.net/soldier_jw/article/details/143490374

相关文章

  • 基于Springboot逍遥大药房管理系统+LW+ppt
    博主介绍:✌全网粉丝3W+,csdn特邀作者、CSDN新星计划导师、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视......
  • Spring Boot日志
     博主主页: 码农派大星.  数据结构专栏:Java数据结构 数据库专栏:MySQL数据库JavaEE专栏:JavaEE软件测试专栏:软件测试关注博主带你了解更多知识目录1.⽇志概述1.1⽇志的⽤途1.系统监控2.数据采集3.⽇志审计2.⽇志使⽤2.1打印⽇志2.1.1在程序中......
  • spring-framework的StopWatch类详解,每个方法带有具体的例子
    目录简介:StopWatch类的应用场景:StopWatch类提供了以下一些主要方法:start():stop():reset():split():unsplit():getTime():getStartTime():toString():isStarted():isStopped():示例代码:以下是一个使用StopWatch测量代码执行时间的简单示例:以下是一个使用StopWatch类的复杂示例,该示例演......
  • SpringBoot数字迎新系统u0p2s 本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1
    题目:SpringBoot数字迎新系统u0p2s进度安排:(1)2024年11月1日-2024年11月15日 确定选题,下达任务书,撰写开题报告;(2)2024年11月15日-2024年12月20日提交开题报告定稿;(3)2024年12月21日-2025年3月14日 完成选题的设计、论文大纲的撰写;(4)2025年3月15日-2025年3月21日  毕业(设......
  • SpringBoot时间管理系统quqp0 本系统(程序+源码+数据库+调试部署+开发环境)
    开题报告内容一、课题背景与意义在信息爆炸和工作节奏日益加快的今天,时间管理成为个人和组织高效运作的关键因素。然而,很多人面临时间分配不合理、任务拖延、工作效率低下等问题。因此,开发一套科学、智能的时间管理系统,帮助用户合理规划时间、提高工作效率,具有重要的现实意义......
  • SpringBoot生活艺术馆管理系统4b9eu 本系统(程序+源码+数据库+调试部署+开发环境)带论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,员工,类别,藏品信息,出库登记,入库登记,藏品修复开题报告内容一、项目背景与意义随着人们精神文化生活需求的日益增长,生活艺术馆作为艺术、文化......
  • 基于springboot+vue实现的公司财务管理系统(源码+L文+ppt)4-102
     基于springboot+vue实现的公司财务管理系统(源码+L文+ppt)4-102摘要本系统是基于SpringBoot框架开发的公司财务管理系统,该系统包含固定资产管理、资产申领管理、资产采购管理、员工工资管理等功能。公司财务管理系统是一种帮助公司进行有效资金管理、会计处理和财务监控的......
  • 基于springboot+vue实现的网上预约挂号管理系统 (源码+L文+ppt)4-104
      结合现有六和医院网上预约挂号管理系统的特点,应用新技术,构建了六和医院网上预约挂号管理系统。首先从需求出发,对目前传统的六和医院网上预约挂号管理进行了详细的了解和分析。根据需求分析结果,对系统进行了设计,并划分为管理员、用户和医生三个角色:主要功能包括用户、医生......
  • 基于springboot+vue实现的网上预约挂号管理系统 (源码+L文+ppt)4-104
      结合现有六和医院网上预约挂号管理系统的特点,应用新技术,构建了六和医院网上预约挂号管理系统。首先从需求出发,对目前传统的六和医院网上预约挂号管理进行了详细的了解和分析。根据需求分析结果,对系统进行了设计,并划分为管理员、用户和医生三个角色:主要功能包括用户、医生......