当前位置: 首页 > news >正文

精简还是全能?如何在 Full 和 Lite 之间做出最佳选择!关于Configuration注解的Full模式与Lite模式(SpringBoot2)

在这里插入图片描述

  • 🏃‍♂️ 微信公众号: 朕在debugger
  • © 版权: 本文由【朕在debugger】原创、需要转载请联系博主
  • 📕 如果文章对您有所帮助,欢迎关注、点赞、转发和订阅专栏!


前言

关于 @Configuration 注解,相信在座的各位 Javaer 都使用过,且大部分人使用它是直接在配置类上塞一个 @Configuration 就完事了,不会去过多使用它的参数,这期文章是来讲述 @Configuration 注解的一个代理相关的参数 proxyBeanMethod。

回顾

说是讲 proxyBeanMethod 参数,但是注解本身的功能也需要大致过一下,@Configuration 注解是 Spring 框架中的一个核心注解,用于定义配置类。

配置类可以包含定义和生成 SpringBean 的方法。这些方法通过 @Bean 注解进行标记。(默认是单实例的)

同时加上 @Configuration 注解的类也允许定义额外的bean( @Import )或导入其他配置类( @ImportResource )。


文章目录

  • 一、何为 Full 模式?何为 Lite 模式?查看源码辩雌雄
    • Full 模式
    • Lite 模式
  • 二、案例验证
    • 2-1、将 proxyBeanMethods 设置为 true(默认)
    • 2-2、将 proxyBeanMethods 设置为 false
  • 三、何时使用 Full 模式与 Lite 模式?
  • 四、总结


一、何为 Full 模式?何为 Lite 模式?查看源码辩雌雄

说 Full,说 Lite,其实都是在说 proxyBeanMethods 这个参数,也就是代理 bean 的方法。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {@AliasFor(annotation = Component.class)String value() default "";boolean proxyBeanMethods() default true;boolean enforceUniqueMethods() default true;
}

可以看出,proxyBeanMethods 方法返回值是一个 Boolean 值,默认值是 true,什么意思呢?

它的值为 true 时,就是 Full 模式。为 false 时,就是 Lite 模式。

Full 模式

Full 模式是当你在类上使用 @Configuration 注解且没有将 proxyBeanMethods 属性显式设置为 false 时(默认为 true )的模式。

在 Full 模式下,Spring 容器会通过 CGLIB 动态代理技术创建配置类的代理实例。

这样做的目的是保证同一个配置类中对其他 @Bean 方法的调用总是返回相同的实例,即保证 @Bean 方法是以单例的方式被管理的,无论它们被调用多少次。

这对于维护配置类中 Bean 之间的依赖关系非常重要,因为它确保了依赖注入的一致性和 Spring 容器中 Bean 的单例特性。

Lite 模式

Lite 模式是当你在类上使用 @Component、@Service、@Repository 等其他组件注解,或者使用 @Configuration 注解但将 proxyBeanMethods 属性显式设置为 false 时的模式。

在 Lite 模式下,Spring 容器不会创建配置类的 CGLIB 代理。

这意味着,配置类中的 @Bean 方法在每次调用时都会生成一个新的实例(除非你自己在方法内部处理单例逻辑),并且这些方法之间的调用就像普通 Java 方法调用一样,不会被 Spring 容器特别处理。

Lite 模式通常用于轻量级的 Bean 定义,或者当配置类中的 @Bean 方法不需要相互依赖时,可以提高性能,减少资源消耗。

二、案例验证

定义一个配置类,定义了两个Bean:一个数据库连接池(DataSource)和一个 JdbcTemplate,后者依赖于前者。

2-1、将 proxyBeanMethods 设置为 true(默认)

@Configuration(proxyBeanMethods = true) // 默认为true,可以不显式设置
public class AppConfig {// 创建了一个DataSource实例@Beanpublic DataSource dataSource() {return new HikariDataSource();}@Beanpublic JdbcTemplate jdbcTemplate() {// 这里调用了dataSource()方法来获取DataSource实例return new JdbcTemplate(dataSource());}
}

在这个例子中,因为 proxyBeanMethods 设置为 true,当 Spring 调用 jdbcTemplate() 方法来创建 JdbcTemplate Bean 时,内部通过调用 dataSource() 方法得到的 DataSource 实例,将会是同一个实例。

这是因为配置类被 CGLIB 代理,确保了 dataSource() 方法的调用在整个应用上下文中只创建了一个 DataSource 实例,即使它被多次调用。

这对于保证某些 Bean 的单例特性是非常有用的,尤其是当这些 Bean 之间存在依赖关系

2-2、将 proxyBeanMethods 设置为 false

@Configuration(proxyBeanMethods = false)
public class AppConfig {// 创建了一个DataSource实例@Beanpublic DataSource dataSource() {return new HikariDataSource();}@Beanpublic JdbcTemplate jdbcTemplate() {// 这里调用了dataSource()方法来获取DataSource实例return new JdbcTemplate(dataSource());}
}

在这种情况下,每次从配置类中调用 @Bean 方法(如直接在另一个 @Bean 方法内调用或者在应用中通过上下文调用)都将创建一个新的实例。

这会导致额外的资源消耗和初始化开销,尤其是对设计为单例使用的资源密集型 Bean(如数据库连接池)来说。

但是,这种的好处就是不需要为配置类创建 CGLIB代理,所以可以提升启动时间和减少运行时的内存占用。

探究:不使用 CGLIB 代理为何可以提升启动时间和减少运行时的内存占用?

  • 减少类的加载和处理时间:
    当 proxyBeanMethods 设置为 true 时,Spring 会通过 CGLIB 库为每个配置类创建一个子类(代理类)。

    这个过程需要加载额外的类,执行字节码生成和处理,这会增加应用启动时的CPU和内存开销。

    相反,当 proxyBeanMethods 设置为 false 时,Spring 不会创建这些代理类,从而减少了启动阶段的资源消耗。

  • 避免方法拦截开销:
    在使用 CGLIB 代理的配置类中,每次调用 @Bean 标注的方法时,都会通过代理类,这个代理类会检查是否已经为该 Bean 创建了实例,并确保返回的是同一个实例(单例 Bean)。这个检查和拦截过程在运行时会产生额外的开销

    而 proxyBeanMethods=false 意味着 @Bean 方法会被直接调用,不经过代理类,从而避免了这部分开销。

  • 减少内存占用
    减少代理对象的内存占用:为配置类创建代理对象会增加 JVM 堆内存的使用。

    每个代理类实例都需要消耗一定的内存,特别是在大型应用中,可能有大量的配置类,这种内存占用就变得非常可观。

    关闭代理( proxyBeanMethods=false )意味着这部分内存开销可以被省略。

  • 优化 Spring 容器的管理开销:
    不使用 CGLIB 代理简化了 Spring 容器对 Bean 生命周期的管理。

    Spring 容器不需要维护额外的信息来处理配置类的代理逻辑,这可以进一步降低内存使用并简化容器的运行时行为。

三、何时使用 Full 模式与 Lite 模式?

Full 模式适用于复杂的配置场景,其中配置类中的 Bean 之间存在依赖关系,需要确保通过配置类方法调用获取到的 Bean 是单例的。它适合于那些需要充分利用 Spring 框架提供的依赖注入和 Bean 生命周期管理特性的应用。

Lite 模式适用于简单或性能敏感的应用,其中配置类主要用于组织 Bean 定义,而 Bean 之间的依赖关系较为简单或可以通过其他方式(如构造器注入)解决。

总之,proxyBeanMethods属性的设置取决于你的具体需求,是否需要在配置类中保持@Bean方法调用的单例特性。

在大多数情况下,默认的 true 值是合理的,但在某些高性能需求和简单配置的场景下,将其设置为 false 可能会更有利。

四、总结

Full ( proxyBeanMethods = true ) 保证每个 @Bean 方法被调用多少次返回的组件都是单实例的。

Lite ( proxyBeanMethods = false ) 每个 @Bean 方法被调用多少次返回的组件都是新创建的。

存在组件依赖关系则使用 Full 模式(默认)。否则可以使用 Lite 模式。


finally

如果大家觉得本文写得不错,别忘了给个赞哦!同时,如果您有任何疑问或建议,欢迎在评论区留言,让我们一起交流、探讨!

相关文章:

精简还是全能?如何在 Full 和 Lite 之间做出最佳选择!关于Configuration注解的Full模式与Lite模式(SpringBoot2)

🏃‍♂️ 微信公众号: 朕在debugger© 版权: 本文由【朕在debugger】原创、需要转载请联系博主📕 如果文章对您有所帮助,欢迎关注、点赞、转发和订阅专栏! 前言 关于 Configuration 注解,相信在座的各位 Javaer 都…...

springboot微信小程序uniapp学习计划与日程管理系统

基于springboot学习计划与日程管理系统,确定学习计划小程序的目标,明确用户需求,学习计划小程序的主要功能是帮助用户制定学习计划,并跟踪学习进度。页面设计主要包括主页、计划学习页、个人中心页等,然后用户可以利用…...

236.二叉树的最近公共祖先

​​题目来源: leetcode题目,网址:236. 二叉树的最近公共祖先 - 力扣(LeetCode) 解题思路: 分别获得从根节点到两个目标节点的链路,寻找到最后一个相同节点即可。 解题代码: /***…...

ETL是什么,有哪些ETL工具?就业前景如何?

ETL是什么 ETL(Extract-Transform-Load),用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目标端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库。它可以自动化数据处理过程,减少…...

无人机系统组装与调试,多旋翼无人机组装与调试技术详解,无人机飞控系统原理

多旋翼无人机飞控系统的组装 在开始组装前,确保您已准备好所有必要的工具和材料。这包括螺丝刀、电烙铁、焊台、杜邦线、飞控板、GPS模块、电机、桨叶等。 飞控安装 安全开关安装,将安全开关固定在机架上。将安全开关的线插到飞控SWITCH插口上。 电调…...

Log360,引入全新安全与风险管理功能,助力企业积极抵御网络威胁

ManageEngine在其SIEM解决方案中推出了安全与风险管理新功能,企业现在能够更主动地减轻内部攻击和防范入侵。 SIEM 这项新功能为Log360引入了安全与风险管理仪表板,Log360是ManageEngine的统一安全信息与事件管理(SIEM)解决方案…...

【开源】JAVA+Vue.js实现高校实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…...

Flink CDC 与 Kafka 集成:Snapshot 还是 Changelog?Upsert Kafka 还是 Kafka?

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维…...

极智一周 | 国产CPU系列汇总、鲲鹏、飞腾、平头哥 And so on

欢迎关注我的公众号 [极智视界],获取我的更多技术分享 大家好,我是极智视界,带来本周的 [极智一周],关键词:国产CPU系列汇总、鲲鹏、飞腾、平头哥 And so on。 邀您加入我的知识星球「极智视界」,星球目前…...

PgSQL技术内幕 - case when表达式实现机制

PgSQL技术内幕 - case when表达式实现机制 CASE表达式如同 C语言中的if/else语句一样,为SQL添加了条件逻辑处理能力,可以根据不同条件返回不同结果。PgSQL支持两种语法:简单表达式和搜索表达式。 1、搜索表达式 语法如下: CASE WH…...

Android9~Android13 某些容量SD卡被格式化为内部存储时容量显示错误问题的研究与解决方案

声明:原创文章,禁止转载! Android9~Android13 某些容量SD卡被格式化为内部存储时容量显示错误问题的研究与解决方案 分析Android11 系统对于EMMC/UFS作为内部存储、SD卡被格式化为内部存储、SD卡/U盘被格式化为便携式存储的不同处理 一.现象描述 实测Android9 Android10 A…...

音视频色彩:RGB/YUV

目录 1.RGB 1.1介绍 1.2分类 1.2.1RGB16 1)RGB565 2)RGB555 1.2.2RGB24 1.2.3RGB222 2.YUV 2.1介绍 2.2分类 2.2.1 YUV444 2.2.2 YUV 422 2.2.3 YUV 420 2.3存储格式 2.3.1 YUYV 2.3.2 UYVY 2.3.3 YUV 422P 2.3.4 YUV420P/YUV420SP 2.3.5 YU12 和…...

MySQL之密码策略和用户授权

华子目录 密码策略查看数据库当前的密码策略密码策略详解caching_sha2_password_auto_generate_rsa_keyscaching_sha2_password_digest_roundscaching_sha2_password_private_key_pathcaching_sha2_password_public_key_pathdefault_password_lifetimedisconnect_on_expired_pa…...

电脑通电自启动设置

首先要进入BIOS,以华硕为例,按下电源键,在开机之前按下delete键,其他电脑可能是esc或者某个f键,请自行查找。 进入BIOS后要找到电源管理,可以在高级选项中找一找,如上图右下角选择高级模式。 …...

hive表加字段

目录 1.给表添加字段2.为什么使用cascade3.使用场景 1.给表添加字段 alter table database.tablename add columns(字段名 字段类型 comment 字段中文含义) cascade;2.为什么使用cascade 在Hive中,当你想要修改表结构,例如添加字段时,可能会…...

从零构建Hugo主题 - I

这是一个系列博客,记录了我从零开始构建Hugo主题https://github.com/tomowang/hugo-theme-tailwind的过程。全系列包括四篇文章,这是第一篇: I. 主要介绍我构建Hugo主题的背景,我对主题的功能想法,以及开发环境的搭建…...

【HarmonyOS应用开发】HTTP数据请求(十四)

文章末尾含相关内容源代码 一、概述 日常生活中我们使用应用程序看新闻、发送消息等,都需要连接到互联网,从服务端获取数据。例如,新闻应用可以从新闻服务器中获取最新的热点新闻,从而给用户打造更加丰富、更加实用的体验。 那么…...

MongoDB聚合: $sortByCount

$sortByCount聚合根据指定表达式的值对输入文档进行分组,然后计算每个不同分组中的文档数。 每个输出文档包含两个字段:一个是包含不同分组值的_id字段,另一个是包含属于该分组或类别的文档数量的计数字段。 文档按计数降序排序。 语法 {…...

FY-SA-20237·8-AI‘sIQ

Translated from the Scientific American, July/August 2023 issue. AI’s IQ ChatGPT aced a test but showed that intelligence cannot be measure by IQ alone. —— By Eka Roivainen 翻译:ChatGPT在一项测试中取得了优异的成绩,但也表明智力不能…...

react将选中文本自动滑动到容器可视区域内

// 自动滚动到可视区域内useEffect(() > {const target ref;const wrapper wrapperRef?.current;if (target && wrapperRef) {const rect target.getBoundingClientRect();const wrapperRect wrapper.getBoundingClientRect();const isVisible rect.bottom &l…...

接口测试中缓存处理策略

在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

数据库分批入库

今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...