3

根据springsource文档,每个 容器singleton仅实例化一次作用域 bean 。
例如,我有一个单例范围的UserDetailsbean,其中包含
有关用户的信息。
在我的 main() 方法中:

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"Spring-Customer.xml"});  
UserDetails ud1 = (UserDetails)context.getBean("userDetails");  
custA.setAddress("Address set by ud1");  
System.out.println("Address : " + ud1.getAddress());  

UserDetails ud2 = (UserDetails)context.getBean("userDetails");  
System.out.println("Address : " + ud2.getAddress());

输出将是

Address set by ud1  
Address set by ud1

因为 userDetails 是一个单例 bean,所以第二次检索 byud2将给出与 ud1 相同的结果。

现在这是我的问题:
对于我的 Web 应用程序UserDetails,我的dispatcher-servlet.xml.

<bean id="userDetails" class="com.mukund.DTO.UserDetails" />  

第一个问题:单例范围也是 Web 应用程序的默认值吗?
如果是:
这个 bean 被自动装配到AccountServiceCustomerService类中。
如果客户说在 CustomerService 类中将用户的名字clientA设置为“UserA”,并在一段时间后从 AccountService 类中检索名字,

第二个问题:它是否获得与“UserA”作为名字的相同的 UserDetails 实例?
第三个问题:与此同时,如果另一个客户说clientB试图在 AccountService 类中获取名字,它会得到“UserA”吗?
第四个问题: clientA、clientB 和其他人会共享同一个 UserDetails 实例吗?如果是:选择原型、请求或会话的范围。

我希望你明白我的意思。请向我解释有关 Web 应用程序的 spring bean 范围。

谢谢

4

2 回答 2

2

是的,单例是 Web 应用程序的默认范围。因此,您在所有服务(以及所有用户)中都获得了相同的 UserDetails 实例。

什么范围适合您取决于您​​到底想要什么。您真的想将数据传输对象注入服务吗?对象应该存在多长时间?

  • 原型范围:每个服务都有自己的 UserDetails 对象
  • 请求范围:您在请求时获得相同的实例
  • 会话范围:只要您在同一个会话中,您就会获得相同的实例。
于 2013-04-01T11:57:43.137 回答
1

默认情况下,spring bean 的范围是单例的,这意味着每个容器一个实例。但这并不意味着所有请求都使用同一个实例。

它是这样工作的。

客户端 A 请求 bean A,容器将查找该 bean A 的实例,如果该实例不可用,它将创建一个实例,然后将其提供给客户端 A。

但是如果 bean A 正在被另一个客户端 B 使用,那么客户端 A 必须等到客户端 B 释放 bean A。

于 2013-04-01T14:30:53.993 回答