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

关于Spring中的@Configuration中的proxyBeanMethods属性

@Configuration的proxyBeanMethods属性

@Configuration注解中,有两个属性:

  • value配置Bean名称
  • proxyBeanMethos,默认是true

这个proxyBeanMethods的默认属性是true。

直接说:当@Configuration注解的proxyBeanMeathods属性是true时,那么此类的Bean就会被Spring代理,被代理就意味着此类中的方法得到的增强处理。那么此类中通过@Bean来对外提供Bean的方法就会被增强

我们可以看一下:

这是一个被@Configuration修饰的类

@Configuration
public class DBConfig {}

我们获取一下这个Bean,打印一下类型

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println(ctx.getBean("DBConfig"));
// com.liumingkai.config.DBConfig$$EnhancerBySpringCGLIB$$ef2610c5@5bfa9431

可以看到,打印出来的类型不是DBConfig,而是被代理后的类型DBConfig$$EnhancerBySpringCGLIB,(可以看到这是CGLib代理出来的类,因为JDK动态代理只能处理有接口的类,而CGlib是通过继承的方式来做代理的)

当设置proxyBeanMethos的属性是false时,得到的就是此类型,不再是代理类

System.out.println(ctx.getBean("DBConfig"));
// com.liumingkai.config.DBConfig@710726a3

我们知道,被@Bean修饰的方法的返回对象,会被注册进入Spring的容器中,受Spring的管理

那将@ConfigurationproxyBeanMethods的属性设置为true会有什么好处呢?
因为@Configuration注解通常用来修饰配置类,会在此类中配置大量的配置项或者用来对外提供Bean

该配置类中通过@Bean来对外提供Bean的方法会被增强,每次都会返回Spring容器管理的Bean

演示一下

例如:在@Configuration修饰的类,在此类中有一个被@Bean修饰的方法,用来对外提供Bean。

我们获取到此类型的Bean后,可以像普通方法一样来调用这个被@Bean修饰的方法,会得到返回的对象。

区别在于:

  • proxyBeanMethods属性为true时,此类被代理,方法得到增强,那么我们每次通过此类型的Bean来调用@Bean修饰的方法,每次返回的都是Spring容器中的单例Bean
  • proxyBeanMethods属性是false时,此类型的Bean就是一个普通的Bean,未被代理,那么每次调用@Bean修饰的方法,这都是一个普通的方法,返回的都是新的普通的对象,不是被Spring容器管理的对象

测试

例如;

  1. 先来看,当proxyBeanMethods为false时
@Configuration(proxyBeanMethods = false)
public class DBConfig {@Beanpublic DruidDataSource getDruidDataSource() {return new DruidDataSource();}
}

测试

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);// 获取此类型的Bean,查看类型
DBConfig dbConfig = ctx.getBean("DBConfig", DBConfig.class);
// 查看类型
System.out.println(dbConfig);
// com.liumingkai.config.DBConfig@f2ff811
// 就是普通的类型,未被代理// 调用此Bean上被@Bean修饰的方法
System.out.println(dbConfig.getDruidDataSource() == dbConfig.getDruidDataSource());
// false 证明此方法就是普通的方法,每次都会创建一个对象
  1. 再来看proxyBeanMethods为true的情况
@Configuration
public class DBConfig {@Beanpublic DruidDataSource getDruidDataSource() {return new DruidDataSource();}
}

测试

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
// 获取此类型的Bean,查看类型
DBConfig dbConfig = ctx.getBean("DBConfig", DBConfig.class);
// 查看类型
System.out.println(dbConfig);
// com.liumingkai.config.DBConfig$$EnhancerBySpringCGLIB$$ef2610c5@5bfa9431
// 可以看到这是一个被代理后的类,不再是原先的类型了// 调用此Bean上被@Bean修饰的方法
// 此方法是被增强后的,每次都会返回Spring容器中的单例Bean
System.out.println(dbConfig.getDruidDataSource() == dbConfig.getDruidDataSource());
// true 证明此方法返回的是Spring容器中的单例Bean

总结

@Configuration修饰的类,本质上也是一个Bean

  • @Configuration中的proxyBeanMethods属性默认是true,意味着这个类会被代理,这个类中通过@Bean修饰的方法会被增强,调用这个方法时,会直接返回受Spring容器管理的Bean(Spring容器中的Bean默认都是单例的)
  • 而如果@Configuration中的proxyBeanMethods属性是false,那么此配置类就是一个普通的类,未被代理。因此调用被@Bean修饰的方法,就是一个普通的方法,每次调用都会返回一个新的对象

相关文章:

关于Spring中的@Configuration中的proxyBeanMethods属性

Configuration的proxyBeanMethods属性 在Configuration注解中,有两个属性: value配置Bean名称proxyBeanMethos,默认是true 这个proxyBeanMethods的默认属性是true。 直接说:当Configuration注解的proxyBeanMeathods属性是true…...

dp1,ACM暑期培训

D - 摆花 P1077 [NOIP2012 普及组] 摆花 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Description 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆。通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花&…...

大厂程序员的水平比非大厂高很多嘛?

最近一个月,筛选了一百多份简历,前前后后面试了二三十人,基本上都是有大厂经历的人。同时,也录用了几个有大厂经历的。但整体而言,打破了对大厂出来的都是优质人才的幻觉。看到的实际情况与想象中的落差还是比较大的。…...

Java开发工具MyEclipse发布v2023.1.2,今年第二个修复版!

MyEclipse一次性提供了巨量的Eclipse插件库,无需学习任何新的开发语言和工具,便可在一体化的IDE下进行Java EE、Web和PhoneGap移动应用的开发;强大的智能代码补齐功能,让企业开发化繁为简。 MyEclipse v2023.1.2官方正式版下载 …...

基于正交滤波器组的语音DPCM编解码算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...........................................................g0zeros(1,lenH); g1zeros(1,l…...

VS2022和QT混合编程打包发布程序

1.在开始菜单输入 CMD 找到 Qt5.15.2(MSVC 64-bit) 2.输入windeployqt exe所在路径 3.运行完毕后,双击打开exe文件,可能会报错,缺少相关的dll,找到缺少的dll拷贝到运行文件夹下即可。...

Filebeat学习笔记

Filebeat基本概念 简介 Filebeat是一种轻量级日志采集器,内置有多种模块(auditd、Apache、Nginx、System、MySQL等),针对常见格式的日志大大简化收集、解析和可视化过程,只需一条命令即可。之所以能实现这一点&#…...

【实战】 九、深入React 状态管理与Redux机制(一) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十六)

文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…...

第九十五回 如何使用dio的转换器

文章目录 概念介绍使用方法使用默认的转换器自定义转换器 示例代码经验分享 我们在上一章回中介绍了"如何打造一个网络框架"相关的内容,本章回中将介绍 如何使用dio的转换器.闲话休提,让我们一起Talk Flutter吧。 概念介绍 转换器主要用来转…...

Python深度学习“四大名著”之一【赠书活动|第二期《Python机器学习:基于PyTorch和Scikit-Learn》】

近年来,机器学习方法凭借其理解海量数据和自主决策的能力,已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。自从AlexNet模型在2012年ImageNet大赛被提出以来,机器学习和深度学习迅猛发展,取…...

RAID相关知识

简介 RAID ( Redundant Array of Independent Disks )即独立磁盘冗余阵列,通常简称为磁盘阵列。RAID技术将多个单独的物理硬盘以不同的方式组合成一个逻辑磁盘,从而提高硬盘的读写性能和数据安全性。 数据组织形式 分块&#x…...

DataStructure--Basic

程序设计数据结构算法 只谈数据结构不谈算法就跟去话剧院看梁山伯与祝英台结果只有梁山伯在演,祝英台生病了没来一样。 本文的所有内容都出自《大话数据结构》这本书中的代码实现部分,建议看书,书中比我本文写的全。 数据结构,直…...

Intellij IDEA 双击启动报错ClassNotFoundException: com.licel.b.z@

项目场景: 新从官网下载了ideaIU-2023.2.win.zip ,安装后双击启动报错, 无法运行idea, 提示信息如下 问题描述 Internal error. Please refer to https://jb.gg/ide/critical-startup-errorsjava.lang.ExceptionInInitializerErrorat java…...

使用 Logstash 及 enrich processor 实现数据丰富自动化

在我之前的文章: Elasticsearch:enrich processor (7.5发行版新功能) Elasticsearch:使用 Elasticsearch ingest pipeline 丰富数据 通过上面的两篇文章的介绍,我们应该充分掌握了如何使用 enrich proce…...

Django模板语法和请求

1、在django关于模板文件加载顺序 创建的django项目下会有一个seeetings.py的文件 如果在seeetings.py 中加了 os.path.join(BASE_DIR,‘templates’),如果是pycharm创建的django项目会加上,就会默认先去根目录找templates目录下的html文件&#xff0c…...

Android跨进程传大图思考及实现——附上原理分析

1.抛一个问题 这一天,法海想锻炼小青的定力,由于Bitmap也是一个Parcelable类型的数据,法海想通过Intent给小青传个特别大的图片 intent.putExtra("myBitmap",fhBitmap)如果“法海”(Activity)使用Intent去传递一个大的Bitmap给“…...

【动态规划part13】| 300.最长递增子序列、674.最长连续递增序列、718.最长重复数组

目录 🎈LeetCode 300.最长递增子序列 🎈LeetCode 674. 最长连续递增序列 🎈LeetCode 718. 最长重复子数组 🎈LeetCode 300.最长递增子序列 链接:300.最长递增子序列 给你一个整数数组 nums ,找到其…...

QMainWindow

文章目录 QMainWindow基本元素QMainWindow函数介绍简单的示例效果图 QMainWindow QMainWindow是一个为用户提供主窗口程序 的类,包含一个菜单栏(menu bar)、多个工具栏 (tool bars)、多个锚接部件(dock widgets)、―个 状态栏(status bar )及一个中心部件(central …...

PV操作解决经典进程同步问题

一.经典同步问题 在学习《操作系统》时,会接触到进程的概念,其中不可避免的接触到进程同步问题,今天我们用熟悉的PV操作解决一些经典的进程同步问题。 二.生产者-消费者问题 1.问题描述 问题描述:一组生产者进程和一组消费者进…...

一文3000字从0到1使用Selenium进行自动化测试

对于很多刚入门的测试新手来说,大家都将自动化测试作为自己职业发展的一个主要阶段。可是,在成为一名合格的自动化测试工程师之前,我们不仅要掌握相应的理论知识,还要进行大量的实践,积累足够的经验,以便快…...

如何在浏览器中高效使用微信网页版?wechat-need-web完整实用指南

如何在浏览器中高效使用微信网页版?wechat-need-web完整实用指南 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 想要在浏览器中稳定使用微…...

Mermaid Live Editor:为什么每个开发者都需要这个实时图表编辑神器?

Mermaid Live Editor:为什么每个开发者都需要这个实时图表编辑神器? 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trendin…...

BudgetMLAgent:多智能体协作与模型级联,低成本自动化机器学习任务

1. 项目概述与核心挑战在机器学习(ML)项目实践中,从数据清洗、特征工程到模型调优、部署上线,每一步都充满了重复性劳动和细节陷阱。对于数据科学家和算法工程师而言,将宝贵的时间耗费在编写样板代码、调试超参数或处理…...

机器学习赋能密度泛函理论:构建半局域交换关联泛函攻克强关联体系

1. 项目概述与核心思路在计算凝聚态物理和量子化学领域,密度泛函理论(Density Functional Theory, DFT)无疑是过去几十年里最成功的“第一性原理”计算方法。它的核心魅力在于,通过Hohenberg-Kohn定理,将描述N个相互作…...

GE 和 Runtime:不是上下游,是协同决策

你以为 GE 做完融合决策,交给 Runtime 执行就行了?其实它们是一个协同系统——GE 决定"融什么",Runtime 决定"怎么跑",但 GE 的融合决策必须考虑 Runtime 的调度约束,Runtime 的调度策略也必须参考…...

智能AI图像识别之工地积水识别数据集 道路积水数据集 管道泄漏漏水数据集 图像yolov8图像数据集 积水识别yolo第10260期

水目标检测数据集简介 水目标检测数据集核心信息表信息类别具体内容数据集类别计算机视觉领域下的目标检测类数据集,专注于 “水-water” 相关目标的检测任务数据数量包含 6.8k 张图像(即 6784 张),为目标检测模型的训练、验证提供…...

LeetCode 560:和为 K 的子数组 | 前缀和与哈希表

LeetCode 560:和为 K 的子数组 | 前缀和与哈希表 引言 和为 K 的子数组(Subarray Sum Equals K)是 LeetCode 第 560 题,难度为 Medium。题目要求在给定整数数组中找出连续子数组的元素和等于 K 的数量。这道题是前缀和与哈希表结合…...

机器人导航核心技术:深度感知与传感器融合的工程实践

1. 项目概述:从“看见”到“理解”的机器人导航革命在机器人技术领域,导航能力是其智能化的核心体现。传统的机器人导航,无论是依赖预设地图的循迹,还是基于简单激光雷达的避障,都像是蒙着眼睛在熟悉的房间里摸索——虽…...

Evident方法论:用观察、假设、测试构建可复现的数据科学工作流

1. 项目概述:为什么我们需要一种新的数据科学方法论?干了十多年数据科学和机器学习项目,从初创公司到大型企业都待过,我越来越觉得,我们这行当的“工作方式”有点不对劲。项目周期总是难以预估,代码和数据像…...

前端国际化进阶:日期时间格式化完全指南

前端国际化进阶:日期时间格式化完全指南 前言 各位前端大佬们,今天咱们来聊聊国际化开发中的"老大难"问题——日期时间格式化。想象一下: 美国人看到 05/23/2024 以为是五月二十三号英国人看到 23/05/2024 才明白是五月二十三号日本…...