了解Web应用程序中的spring bean范围

时间:2013-04-01 11:32:44

标签: java spring web scope javabeans

根据springsource文档,每个实例化singleton范围的bean只会被实例化一次 容器。例如,我有一个单例范围的UserDetails bean,其中包含信息
关于用户。
在我的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,ud2的第二次检索将得到与ud1相同的结果。

现在这是我的问题:
对于我的Web应用程序,我在UserDetails

中有以下dispatcher-servlet.xml. bean
<bean id="userDetails" class="com.mukund.DTO.UserDetails" />  

第一个问题:单例范围是否也是Web应用程序的默认范围? 如果是:
此bean已自动装入AccountServiceCustomerService类 如果客户说clientA已将用户的名字设置为CustomerService类中的“UserA”,并且一段时间后它会从AccountService类中检索第一个名称,

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

我希望你理解我的观点。请解释一下关于Web应用程序的spring bean范围。

感谢

2 个答案:

答案 0 :(得分:2)

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

适合自己的范围取决于您的确切需求。您真的想将数据传输对象注入服务吗?这个物体应该存在多久?

  • 原型范围:每个服务都有自己的UserDetails对象
  • 请求范围:您在请求时获得相同的实例
  • 会话范围:只要您在同一会话中,就会获得相同的实例。

答案 1 :(得分:1)

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

就像这样。

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

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