Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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 为什么原型作用域与有状态bean一起使用?_Java_Spring_Inversion Of Control_Javabeans - Fatal编程技术网

Java 为什么原型作用域与有状态bean一起使用?

Java 为什么原型作用域与有状态bean一起使用?,java,spring,inversion-of-control,javabeans,Java,Spring,Inversion Of Control,Javabeans,春季医生- 根据经验,所有有状态bean都应该使用prototype作用域,而无状态bean应该使用singleton作用域 因此,当您必须跨上下文一致地维护某些状态/数据时,有状态bean是必要的。比如说银行应用程序。您希望您的对象在各种操作(存款、取款等)中保持同步 因此,在单例范围内,您可以获得相同的东西—跨上下文的对象一致性 那么为什么javadoc声明opposite呢 救命!!:) 这主要是由于在多线程环境中使用单例bean时需要保持同步的问题。对于prototype bean,每个

春季医生- 根据经验,所有有状态bean都应该使用prototype作用域,而无状态bean应该使用singleton作用域

因此,当您必须跨上下文一致地维护某些状态/数据时,有状态bean是必要的。比如说银行应用程序。您希望您的对象在各种操作(存款、取款等)中保持同步

因此,在单例范围内,您可以获得相同的东西—跨上下文的对象一致性

那么为什么javadoc声明opposite呢


救命!!:)

这主要是由于在多线程环境中使用单例bean时需要保持同步的问题。对于prototype bean,每个对bean的请求都将创建一个新的bean实例,因此您不需要关心跨线程同步访问bean的状态。但在混合原型和单例bean时需要非常小心,因为原型bean只会连接到单例bean中一次。也就是说,它实际上变成了这个bean中的单例

如果您真的需要在单例bean中使用原型bean,您应该这样做

大多数情况下,您不会遇到使用有状态bean的需要,因为状态是由单独的持久性层提供的,或者直接由调用方本身提供的

具有状态的单例bean的一个例子是缓存。通过使用专用的缓存库,如infinispan、guava、hazlecast。。。在这里,您不需要太在意同步,因为这方面是由这些库为您处理的


考虑到您的银行示例,您可能不希望将事务细节存储在诸如Java堆之类的Emperal存储中。如果您的应用程序因某种原因崩溃,所有这些信息将无法恢复地丢失。此信息需要存储在持久性存储中,如数据库。

如果您有一个单例有状态bean,则每次访问该bean时,该状态都将被覆盖,使其无法使用。如果下面的答案解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道你的问题已经解决到令你满意的程度,并让帮助你的人相信你的帮助。对于一个完整的解释,这是正确的,但如果有一个bean是单态的;bean A中有一个类型为bean B的属性(这是原型);在本例中,对于bean B,每个spring容器仍然只有一个实例,因为父类是singleton。您在哪里找到了这个:
对于原型bean,每个线程将获得一个新的bean实例
?在spring中,doc被写入
导致每次请求特定bean时都创建一个新的bean实例
。有了这一点,我知道每一个thime都会在另一个bean中引用。@LinuRadu,是的
thread
在这里不是最好的措辞,应该是request。我会重新措辞。在上面的示例中,如果您有第三个bean
C
,其属性类型为
B
,则将有
B
的第二个实例。如您所指定,将创建另一个类型为B的实例,但是关于
您不需要关心跨线程同步访问bean的状态
为什么您说同步问题已经解决了?如果您拥有所有的树bean原型(包括@RestController和@Service),那么可能就是这样。外卖应该是“不要使用原型bean”