@Configuration的proxyBeanMethods

作用:用于控制配置类的代理行为,确定配置类中的 @Bean 方法是否被代理,从而影响 Bean 的创建和管理方式

比较

proxyBeanMethods = true

  • 默认行为: 当 proxyBeanMethods 设置为 true(默认值)时,Spring 会为配置类创建一个代理对象。这个代理对象确保在调用 @Bean 方法时,如果该 Bean 已经在 Spring 容器中存在,则返回容器中的单例实例,而不是每次都创建一个新的实例。
  • 保证单例: 这种方式确保了配置类中的 @Bean 方法是幂等的,即无论调用多少次,返回的都是同一个实例。这对依赖注入和单例模式非常重要。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyService();}@Beanpublic MyController myController() {// 调用 myService() 方法时,返回的是 Spring 容器中的 MyService 实例,而不是新创建的实例return new MyController(myService());}
}

proxyBeanMethods = false

  • 禁用代理: 当 proxyBeanMethods 设置为 false 时,Spring 不会为配置类创建代理。这意味着每次调用 @Bean 方法时,都会创建一个新的实例,而不是返回容器中的单例实例。
  • 适用场景: 如果你不需要 @Bean 方法之间的依赖关系,并且想要优化性能以避免代理开销,可以将 proxyBeanMethods 设置为 false。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration(proxyBeanMethods = false)
public class AppConfig {@Beanpublic MyService myService() {return new MyService();}@Beanpublic MyController myController() {// 调用 myService() 方法时,每次都会创建一个新的 MyService 实例return new MyController(myService());}
}

在这个配置中,每次调用 myService() 方法时,都会创建一个新的 MyService 实例。如果 myController() 方法被频繁调用,将会导致大量的 MyService 实例被创建。

proxyBeanMethods = false为什么能优化性能

proxyBeanMethods = true(默认值)
  • 代理开销: 当 proxyBeanMethods 设置为 true 时,Spring 会为配置类创建一个 CGLIB 代理。这个代理会拦截对 @Bean 方法的调用,以确保在方法之间引用同一个 Bean 实例。虽然这种代理机制确保了 Bean 的单例性和依赖关系,但它也引入了一些额外的开销。
  • 运行时检查: 每次调用 @Bean 方法时,代理对象会进行检查,以决定是返回现有的 Bean 实例还是创建一个新的实例。这个过程涉及到运行时反射和方法调用的拦截,都会消耗一定的资源。
proxyBeanMethods = false
  • 无代理开销: 当 proxyBeanMethods 设置为 false 时,Spring 不会为配置类创建代理。这意味着配置类中的 @Bean 方法是普通的 Java 方法,没有代理对象来拦截和处理这些方法调用。
  • 直接调用: @Bean 方法的调用是直接的,没有额外的检查和拦截。这减少了运行时的开销,因为不再需要代理机制的参与。
  • 编译时优化: 因为没有代理,Java 编译器和 JVM 可以对配置类和 @Bean 方法进行更多的优化,例如方法内联和其他 JIT 编译优化。

proxyBeanMethods = false时,创建对象也是要消耗性能的

代理开销 vs. 对象创建开销
  • 代理开销(proxyBeanMethods = true): Spring 通过创建 CGLIB 代理来管理配置类中的 @Bean 方法。这确保了方法调用返回的是容器中的单例实例,但代理的创建和运行时拦截会引入额外的开销。
  • 对象创建开销(proxyBeanMethods = false): 每次调用 @Bean 方法时都会创建一个新的对象实例。虽然避免了代理相关的开销,但频繁的对象创建也会增加内存使用和垃圾回收的负担。
适用场景
  • 频繁调用 @Bean 方法且需要单例: 如果配置类中的 @Bean 方法被频繁调用,并且这些方法之间存在依赖关系,使用 proxyBeanMethods = true 更加合适。这种情况下,代理开销可以接受,因为它确保了方法调用的幂等性和单例性。
  • 简单配置类或不需要单例: 如果配置类中的 @Bean 方法不会频繁调用,或者每次调用返回的新实例不会对应用的性能造成显著影响,可以使用 proxyBeanMethods = false。这种配置避免了代理开销,适用于简单的、独立的 Bean 创建场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML进阶:探索语义化标记与可访问性优化

随着Web技术的不断发展,HTML不再仅仅是用来定义网页内容的标记语言,它还被赋予了更多的责任,如提高网页的可读性、可维护性和可访问性。语义化标记(Semantic Markup)和可访问性优化(Accessibility Optimiza…

航班管理系统【C语言版】单文件编写

开发环境 操作系统:Windows 11专业版开发工具:Visual Studio Code编程语言:C 项目考核验收表 1. 设计目标 本项目的目标是设计并实现一个简易的航班管理系统。该系统应具备以下功能: 添加航班信息查询航班信息显示所有航班信…

自动标签的艺术:sklearn中的聚类标签自动分配技术

自动标签的艺术:sklearn中的聚类标签自动分配技术 在机器学习领域,聚类是一种无监督学习方法,它将数据集中的样本分组,使得同一组内的样本相似度高,而不同组之间的样本相似度低。与有监督学习不同,聚类不依…

前端经验:使用sheetjs导出CSV文本为excel

应用场景 很多web表格组件没有提供直接的导出excel功能,但提供了导出CSV的功能。 如果能想办法拿到CSV的内容,就可以利用sheetjs生成excel并导出。 实施步骤 1.拿到CSV的内容字符 每种表格组件都有各自的CSV生成方法,不管用什么方法&…

[python] 利用opencv显示对比试验效果

利用 opencv 显示 对比实验效果 选择有效区域 import os import random import uuidfrom tqdm import tqdm import cv2 import numpy as np import matplotlib.pyplot as plt GT_Dir"results_compare/GT/" Bicubic_dir"results_compare/Bicubic4x/" Phase…

服务器证书基于 OpenSSL一键颁发脚本

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

vue使用了代理跨域,部署上线,使用Nginx配置出现问题,访问不到后端接口

1、如果路由的mode是history模式的要加上框框里的哪句,然后配置下面的location router location / {root /usr/local/app/dist/; #vue文件dist的完整路径try_files $uri $uri/ router;index index.html index.htm;}#error_page 500 502 503 504 /50x.html;lo…

数据分析入门指南:数据库入门(五)

本文将总结CDA认证考试中数据库中部分知识点,内容来源于《CDA模拟题库与备考资料PPT》 。 CDA认证,作为源自中国、面向全球的专业技能认证,覆盖金融、电信、零售、制造、能源、医疗医药、旅游、咨询等多个行业,旨在培养能够胜任数…

RK3328 Debian安装OpenMediaVault

手头有RK3328板卡,自己编译了Debian并烧录跑起来了,拿它来作为NAS使用,在网上找了一些开源的NAS系统,最终敲定使用OpenMediaVault这套,下面是在RK3328 Debian系统下的安装过程: 0、先打开一个Terminal终端…

CVE-2023-33440(任意文件上传)

简介 Faculty Evaluation System v1.0 存在未授权任意文件上传漏洞漏洞 过程 打开靶场 进行目录扫描 发现后台login.php,进入查看 弱口令进行测试,无效,无法进入 根据提示是未授权访问文件上传 ,应该是不需要登录就能触发漏洞…

分布式Session共享的5类技术方案,与优劣势比较

分布式Session共享是分布式系统中常见的问题,主要解决在多个服务器之间共享用户会话信息的需求。以下是五种常见的分布式Session共享技术方案及其优劣势比较: 1. Session复制 设计思路: 多个Web服务器之间相互同步Session,每个W…

Apple Vision Pro 开发资源大全

Apple Vision Pro 是一款强大的视觉处理设备,为开发者提供了丰富的应用场景和开发资源。以下是与 Apple Vision Pro 相关的应用程序、开发者资源、社区和文章的集合,旨在帮助开发者更好地利用这一平台。 1. Vision Pro 使用技巧 技巧和窍门:提供一系列实用的使用技巧,帮助…

http 协议中GET如何传递参数(Query String)?

因为项目需要,最近在手搓一个Http Connection,目的是实现最简单的Http访问,能通过Get或则Post方法向数数的日志服务器传递数据。之前看过数数提供的开发包,因为服务器用的是C,而数数提供的C/C开发包简陋的吓人&#xf…

openstack设置IP直接登录,不需要加dashboard后缀

openstack 实验环境,openstack-t版,centos2009 修改配置文件 [rootcontroller ~]# vim /WEBROOT /etc/openstack-dashboard/local_settings #将dashboard去掉 WEBROOT /dashboard/ #改为 WEBROOT /[rootcontroller ~]# vim /etc/httpd/conf.d/openst…

深度学习每周学习总结N4:中文文本分类-Pytorch实现(基本分类(熟悉流程)、textCNN分类(通用模型)、Bert分类(模型进阶))

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 0. 总结:1. 基础模型a. 数据加载b. 数据预处理c. 模型搭建与初始化d. 训练函数e. 评估函数f.拆分数据集运行模型g. 结果可…

C++STL初阶(7):list的运用与初步了解

在了解了vector之后,我们只需要简单学习List与vector不一样的接口即可 1.list的基本接口 1.1 iterator list中,与vector最大的区别就是迭代器由随机迭代器变成双向迭代器 string和vector中的迭代器都是随机迭代器,支持-等,而LIS…

达梦数据库 MPP集群搭建(带主备)

MPP集群搭建(带主备) 1.背景2.操作内容和要求3. 具体步骤3.1 搭建过程3.1.1 集群搭建3.1.2 准备工作3.1.2.1 初始化3.1.2.2 备份数据库 3.1.3 配置主库EP013.1.3.1 配置dm.ini3.1.3.2 配置dmmal.ini3.1.3.3 配置dmarch.ini3.1.3.4 配置dmmpp.ctl3.1.3.5 …

Seata 面试题及答案整理,最新面试题

Seata 是如何解决分布式事务问题的? Seata通过事务协调器、事务管理器和资源管理器三个核心组件来解决分布式事务问题。 1、事务协调器(TC): TC作为全局事务的协调者,负责维护全局和分支事务的状态,并协调全局提交或回滚。 2、事务管理器(TM): TM负责定义全局事务的范…

百度文心大模型4.0 Turbo面向企业开放 多款旗舰模型降价

在2024年世界人工智能大会期间,百度副总裁谢广军宣布了文心一言4.0Turbo模型对企业用户的全面开放,并介绍了其定价策略。文心一言4.0Turbo的输入定价为0.03元/千Tokens,输出定价为0.06元/千Tokens。谢广军指出,如果按照3:1的输入输…

ArcGIS Pro SDK (九)几何 7 多点

ArcGIS Pro SDK (九)几何 7 多点 文章目录 ArcGIS Pro SDK (九)几何 7 多点1 构造多点 - 从映射点的枚举2 构造多点 - 使用 MultipointBuilderEx3 修改多点的点4 从多点检索点、2D 坐标、3D 坐标 环境:Visual Studio 2…