Java 原型范围会造成多少开销?

Java 原型范围会造成多少开销?,java,spring,spring-boot,spring-mvc,Java,Spring,Spring Boot,Spring Mvc,我的理解是,原型范围的JavaBean类在每次被请求时都被实例化,而单例范围的JavaBean在应用程序启动时被实例化一次 我的问题是:使用原型范围会造成多少开销 Spring框架是否尝试回收原型范围的对象,以减少重复实例化造成的开销 原型作用域造成的开销是否足以保证尽可能多的JavaBean类是无状态的,以便我可以对它们应用单例作用域 使用prototype作用域与使用“new”实例化相同,只是新对象将由Spring管理。Spring将能够应用方面、注入依赖项等。。还将有为包装对象而创建的代

我的理解是,原型范围的JavaBean类在每次被请求时都被实例化,而单例范围的JavaBean在应用程序启动时被实例化一次

我的问题是:使用原型范围会造成多少开销

  • Spring框架是否尝试回收原型范围的对象,以减少重复实例化造成的开销
  • 原型作用域造成的开销是否足以保证尽可能多的JavaBean类是无状态的,以便我可以对它们应用单例作用域

使用prototype作用域与使用“new”实例化相同,只是新对象将由Spring管理。Spring将能够应用方面、注入依赖项等。。还将有为包装对象而创建的代理类的开销

Spring不会尝试重用这些实例


如果不希望在引用bean时创建新实例,那么就不应该使用原型。您的解决方案要么需要独立实例(可能是由于并发性),要么允许使用单实例。对象使用的内存不太可能是您使用的作用域的决定因素。

使用prototype作用域与使用“new”实例化相同,只是新对象将由Spring管理。Spring将能够应用方面、注入依赖项等。。还将有为包装对象而创建的代理类的开销

Spring不会尝试重用这些实例


如果不希望在引用bean时创建新实例,那么就不应该使用原型。您的解决方案要么需要独立实例(可能是由于并发性),要么允许使用单实例。对象使用的内存不太可能是您使用的作用域的决定因素。

您不应该考虑原型和单例作用域之间的开销,而应该只考虑它们的使用方式。如果它们是将在应用程序的整个生命周期中存在的无状态对象,则正确的作用域为singleton。该范围中存在许多bean,例如控制器、服务或持久性层中的bean。与Spring安全框架相关的大多数bean也是无状态的,并且位于单例范围内


如果您想要为特定的处理创建一个全新的bean,然后在使用它时丢弃它,那么它就是原型范围的用例。由于我主要将spring用于Web应用程序,所以我很少使用原型范围的bean,而是使用请求范围的bean,它们有一个相似的用例:它们是为HTTP请求处理而创建的。唯一需要注意的是,如果必须在单例bean中注入原型或请求范围bean,则必须使用允许连接到当前原型bean的代理(可能在线程存储中)而不是在创建单例时创建的bean。

您不应该考虑原型和单例范围之间的开销,而应该只考虑它们的使用方式。如果它们是将在应用程序的整个生命周期中存在的无状态对象,则正确的作用域为singleton。该范围中存在许多bean,例如控制器、服务或持久性层中的bean。与Spring安全框架相关的大多数bean也是无状态的,并且位于单例范围内


如果您想要为特定的处理创建一个全新的bean,然后在使用它时丢弃它,那么它就是原型范围的用例。由于我主要将spring用于Web应用程序,所以我很少使用原型范围的bean,而是使用请求范围的bean,它们有一个相似的用例:它们是为HTTP请求处理而创建的。唯一需要注意的是,如果必须在单例bean中注入原型或请求范围bean,则必须使用允许连接到当前原型bean的代理(可能在线程存储中)而不是在singleton创建时创建的bean。

我无法回答您的问题,但我从不使用Prototype范围,因为我所有的bean都是无状态的。在您的案例中使用Prototype作用域的原因是什么?每次创建新对象的开销相同,为什么使用Prototype作用域?为什么要独自承担清理bean的开销?@SimonMartinelli我的bean是有状态的(它们包含实例变量),并且它们可能同时为多个请求提供服务。我担心如果我的bean没有被定义为原型,就会出现线程安全问题。我不能回答你的问题,但我从不使用原型范围,因为我所有的bean都是无状态的。在您的案例中使用Prototype作用域的原因是什么?每次创建新对象的开销相同,为什么使用Prototype作用域?为什么要独自承担清理bean的开销?@SimonMartinelli我的bean是有状态的(它们包含实例变量),并且它们可能同时为多个请求提供服务。我担心如果我的bean没有被定义为原型,那么会出现线程安全问题。