何时在 Springs @Configuration 中将 proxyBeanMethods 设置为 false?

2024-04-28

当查看 spring 自动配置时源代码 https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure似乎每个自动配置类都设置proxyBeanMethods = false.

@Configuration(proxyBeanMethods=false)
public class SomeAutoConfiguration {
    ...
}

javadoc 给出了这个特定字段的详细解释:

指定是否应代理 {@code @Bean} 方法以强制执行 bean 生命周期行为,例如甚至返回共享的单例 bean 实例 如果在用户代码中直接调用 {@code @Bean} 方法。 (...) 如果不需要这样做,因为每个特定配置的 {@code @Bean} 方法是独立的,被设计为容器使用的简单工厂方法, 将此标志切换为 {@code false} 以避免 CGLIB 子类处理。(...)

读完这篇文章后,我仍然很困惑什么时候最好将其设置为 false。

这是我的问题:

  • 有人可以给出一个具体的例子,这个字段何时应该为真并解释原因?
  • 为什么在自动配置类上此字段设置为 false?

Update:在 github 上发现了两个问题,给出了一些解释为什么会这样false在大多数自动配置类上:

  • https://github.com/spring-projects/spring-boot/issues/9068 https://github.com/spring-projects/spring-boot/issues/9068
  • https://github.com/spring-projects/spring-framework/issues/22461 https://github.com/spring-projects/spring-framework/issues/22461

像这样的事情:

@Configuration(proxyBeanMethods=true)
public class SomeConfiguration {
    @Bean
    ServiceA serviceA(){
      return new ServiceA(sharedService());
    }

    @Bean
    ServiceB serviceB(){
      return new ServiceB(sharedService());
    }

    @Bean
    ServiceC sharedService(){
      return new ServiceC();
    }
}

在这里,proxyBeanMethods 将确保“sharedService”方法将被拦截并重用其结果。如果按照正常的java逻辑,当调用serviceA()和serviceB()时,将有两个不同的ServiceC实例,而当直接调用sharedService()时,将创建第三个实例。然后代理拦截器将确保实际方法只被调用一次,因此只创建一个共享ServiceC的实例,并且ServiceA和ServiceB都将获得共享实例。

不过 proxyBeanMethods=true 在启动时会有性能消耗,特别是对于有很多 @Configuration 类的库,比如 spring-boot 的内部库。参见例如https://github.com/spring-projects/spring-boot/issues/9068#issuecomment-461520814 https://github.com/spring-projects/spring-boot/issues/9068#issuecomment-461520814对 Spring WebFlux 的影响。 默认情况下他们无法将其更改为 false,因为这会破坏向后兼容性。请参阅原始问题中的链接。

您可以使用不同的配置模式来避免这种情况,这可能就是自动配置类所做的。

实现此目的的一种方法是通过方法参数而不是嵌套方法调用自动装配服务。它在普通 Java 中意义不大,但在 Spring 配置中有效:

@Configuration(proxyBeanMethods=false)
public class SomeSmarterConfiguration {

    @Bean
    ServiceC sharedService(){
      return new ServiceC();
    }

    @Bean
    ServiceA serviceA(ServiceC sharedService){
      return new ServiceA(sharedService);
    }

    @Bean
    ServiceB serviceB(ServiceC sharedService){
      return new ServiceB(sharedService);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时在 Springs @Configuration 中将 proxyBeanMethods 设置为 false? 的相关文章

随机推荐

  • 时间序列的线性回归Python(numpy或pandas)

    我对 python 和一般编程都很陌生 所以请原谅任何简单的错误 应该显而易见的事情 我想做的事情非常简单 我只想将线性趋势 一维多项式 拟合到一堆时间序列上 看看斜率是正还是负 现在我只是想让它在一个时间序列中工作 问题 pandas 和
  • 使用 select 操作 mathematica 中的列表

    我已将一些数据导入 Mathematica 中 数据将类似于 0 2 2 3 4 3 5 4 8 4 我想丢弃 x 值小于给定值的所有元素 或者创建一个包含 x 值大于该值的数据的新列表 我假设Select应该做这项工作 但我不知道怎么做
  • 文件是为不受支持的文件格式构建的?

    我在 OS X 上 当我尝试在终端中执行此命令时出现编译错误 g Wall o test E test E cppdynamic array cpp oracle o 我的其他 C 文件 例如test A cpp and test B cp
  • Java,ASM:如何从ASM InsnNode获取操作码名称和TagValue?

    我正在研究一些类文件分析 并且正在研究使用 ASM 来读取类 在 Javap 中 操作码以及 tagName 和 tagValue 是内联打印的 但在每个 AbstractInsnNode 中 我只看到 int 的字段 而不是 tagVal
  • 奇怪的 Rails 路由行为:两个 id 在嵌套资源中交换

    我在我的应用程序中设置了以下路由 表单属于一个站点 map resources sites do site site resources forms end 但是 当我尝试使用帮助程序 例如 edit site form path form
  • CSS中的继承是什么意思? [复制]

    这个问题在这里已经有答案了 我经常使用background inherit 像这样 许多其他 CSS 属性接受继承作为值 但有什么作用inherit意思是 它是如何工作的 inherit只是意味着样式将从元素的父元素继承 例如 jsFidd
  • Pulp.pulpTestAll() 测试失败,太多值无法解压

    我的操作系统是window 7 Pulp版本是1 6 1 gurobi版本是7 0 1 可以成功导入gurobipy Pull solvers GUROBI确实通过了测试 所以我可以使用gurobi 然而 pulp solvers CPLE
  • iOS 不同设备的单一尺寸类别中的不同字体大小

    在iOS 8中 我们可以为每个尺寸类别设计不同的UI布局 我面临的问题是 我设计了紧凑宽度和常规高度的布局 纵向所有 iPhone 的尺寸类别 但我想为 3 5 和 4 英寸设备 iPhone 4 和 5 保留较小的标签字体大小 然后对于
  • IntelliJ IDEA 的 Mylyn 替代品?

    我们公司已经使用 Unfuddle 一年了 我所有的同事都可以使用名为 Mylyn 的 Eclipse 插件轻松访问 Unfuddle 票证 IntelliJ IDEA 是否存在类似的东西 如果没有 你能建议一些替代方法来处理来自 IDEA
  • iPhone 开发——performSelector:withObject:afterDelay 还是 NSTimer?

    重复方法调用 或消息发送 我猜合适的术语是 x秒 是使用 NSTimer NSTimer 的 ScheduledTimerWithTimeInterval target selector userInfo repeats 还是让该方法在最后
  • C++11 中的“类模板Example;”语句是什么意思?

    我已被提及 显式模板实例化 http www cplusplus com articles 1C75fSEw at cplusplus com http www cplusplus com 给出了以下示例 template
  • 如何用好Fortran语句标签?

    我正在开发一个用 Fortran 95 编写的模型 我对此完全陌生 语句标签的概念似乎很奇怪 到目前为止我只找到了标签可以由作者任意决定的解释 通常以 10 为增量 除了更容易地找出语句的结尾位置之外 这些标签还有其他实际用途吗 以及关于如
  • 会话在 Laravel 5.4 上不持久

    我在 Laravel Sessions 方面遇到了一些问题 现在我在 Laravel 5 4 下工作 所以 我使用以下代码来设置会话 request gt session gt put usuario somevalue 但是当我尝试使用以
  • 您必须至少选择一个列出的平台才能显示

    我正在创建一个简单的应用程序 当我尝试保存更改时收到此错误 您必须至少选择一个要显示的列出平台 请参阅此处的屏幕截图 http panstickers com au webimages fb error gif http pansticke
  • Ace编辑器使用javascript触发事件

    有没有类似的东西 editor getSession trigger change 我想要这个的原因是因为编辑器进出新的 所以当它返回视图时我需要它做正常的 更改 事情 但我不想等待用户输入 目前我有 editor getSession o
  • 如何解决curl php中的HTTP/1.1 400 Bad Request

    我必须打一个 aspx来自 php 代码的页面 url 我试图使用curl 来访问 但出现以下错误并且 url 中没有空格 HTTP 1 1 400 Bad Request Content Type text html charset us
  • PHP 通过 FTP 下载整个文件夹(递归)

    我目前有一个非常大的网站 大小约为 5GB 包含 60 000 个文件 当前主机并没有做太多事情来帮助我将网站转移到新主机 我的想法是在新主机上制作一个简单的脚本 通过 FTP 传输到旧主机并下载整个 public html 文件夹 递归地
  • 在进行字符识别之前使用 OpenCV 进行图像预处理(超正方体)

    我正在尝试开发简单的 PC 应用程序用于车牌识别 Java OpenCV Tess4j 图像不是很好 进一步它们会很好 我想对超立方体图像进行预处理 但我被困在车牌检测 矩形检测 上 我的步骤 1 源图像 Mat img new Mat i
  • 在 Matlab、VB6 和 VB.NET 程序之间发送消息的最简单方法

    我们正在将一套数据采集和分析例程从 VB6 程序升级为 VB NET VB6 和 Matlab 程序的混合体 我们希望保持系统模块化 单独的 EXE 以便我们可以轻松创建专门的独立分析程序 而无需不断升级大型应用程序 当所有程序都是用 VB
  • 何时在 Springs @Configuration 中将 proxyBeanMethods 设置为 false?

    当查看 spring 自动配置时源代码 https github com spring projects spring boot tree master spring boot project spring boot autoconfigu