Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 何时使用Spring原型范围?_Java_Spring_Scope_Singleton_Prototype Scope - Fatal编程技术网

Java 何时使用Spring原型范围?

Java 何时使用Spring原型范围?,java,spring,scope,singleton,prototype-scope,Java,Spring,Scope,Singleton,Prototype Scope,我想知道我应该在春季什么时候使用原型范围?我知道如果bean被请求,singleton将返回相同的对象实例 那么我们为什么要考虑原型< /代码>? 举例说明将有助于理解其必要性。简单明了的定义: Prototype scope=每次注入/查找时都会创建一个新对象。每次它都将使用新的SomeBean() Singleton scope=每次注入/查找同一对象时都返回该对象。在这里,它将实例化SomeBean的一个实例,然后每次返回它 原型bean是在使用时创建的。因此,当您希望使用statef

我想知道我应该在春季什么时候使用
原型
范围?我知道如果bean被请求,singleton将返回相同的对象实例

那么我们为什么要考虑<代码>原型< /代码>?


举例说明将有助于理解其必要性。

简单明了的定义:

  • Prototype scope=每次注入/查找时都会创建一个新对象。每次它都将使用新的
    SomeBean()

  • Singleton scope=每次注入/查找同一对象时都返回该对象。在这里,它将实例化
    SomeBean
    的一个实例,然后每次返回它

原型bean是在使用时创建的。因此,当您希望使用statefullbean时,有时强烈需要使用prototype作用域,或者当您不习惯在bean中缓存任何值时。原型bean可以与一个会话或某个调用相关联

例如:


数据访问对象(DAO)通常不配置为原型,因为典型的DAO不包含任何会话状态;作者更容易重用单例图的核心。

使用scopeprototype有一些有趣的用例您将构建一个更好、更可靠的应用程序设计/架构,例如,一个实时系统

想象一下,你必须建立一个实时的车辆跟踪系统,你将有2.000.000辆车每5秒共享一次信息, 在服务器端,您将使用两组或更多不同的配置,一组用于汽车,另一组用于卡车

基于这个简单的示例,如果您通过原型模式将应用程序设计为与内存中不同的配置组一起工作,您将获得更好的性能

因此,在这种情况下,每当服务器收到来自卡车的新消息时,例如,服务器将从车辆配置实例的哈希映射中获取内存中的配置实例,然后应用此消息必须具有的配置行为,例如:如超时,重试。。。等等


我想强调的是,有很多方法可以实现这种情况,但这个例子表明原型模式在性能和设计模式方面非常强大。

正如文档所述,创建具有原型范围的bean Foo与调用:

Foo foo = new Foo(dependency1, dependency2, ...);
foo.initialize(dependency7, dependency8...);
使用prototype scope bean而不是
new
的唯一好理由是,用于创建和初始化实例的依赖项应该保留在需要新实例的代码之外

例如,如果您想编写类似于ejb2java实体bean的持久性代码,例如

Person p = ...
p.setName("John Doe");
p.save(); // write to DB
而不是使用JPA方式

Person p = new Person();
p.setName("John Doe");
personService.save(p); // write to DB
在实体bean代码样式中,person实例需要知道应该如何持久化,因此需要向它注入持久化细节,而编写person代码的人不应该知道这些细节

另一个例子:
如果希望在应用程序的许多地方使用非线程安全的SimpleDataFormat Java类,并使用配置文件中的格式模式(可能根据其他条件使用不同的格式)。您可以使用prototype作用域每次都获取一个新实例,而不是在所有这些位置创建一个新的format实例,并从文件(或spring属性)加载格式化字符串,设置公共格式的细节放在一个地方。

那么应该创建哪种类型的bean作为原型?只创建那些每次都希望有新实例的bean。老实说,我不会在99%的情况下使用原型。一个好的做法是通过构造函数传递依赖项。因此,永远不要使用范围原型。相反,您应该使用new或singleton工厂。基本上,想象一下当您访问bean原型bean时,每次都希望有一个新对象的情况。每次您想要访问bean时,它都会被实例化,就像您在简单POJO中使用
new User()
一样。这个答案有什么意义?它根本没有指定何时使用原型范围。它只是转移了话题,说了为什么DAO不是典型地配置为一个一点也回答不了这个问题的原型。为了提高实时系统的性能,代码的设计应该尽量减少事务期间对象实例化的频率。每次从Spring框架请求原型时,原型都会被实例化。原型的这种行为会降低实时性能。评论员认为,为了提高性能,应该从内存中访问配置数据,但要小心使用原型来实现该设计要求。相反,请考虑定义一组相同类型的单元格,每一个都是在不同状态下启动的。Hi @ MarkNorman,请你分享一个例子,我怎样才能想出这个解决方案?“相反,考虑一下定义一组相同类型的单体,每一个都是在不同状态下启动的”听起来很有意思。非常感谢您分享您的反馈。您将在此处找到一个示例:。请注意,有两个类型为
LocalContainerEntityManagerFactoryBean
的配置bean,一个名为
userEntityManager
,另一个名为
productEntityManager