根据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已自动装入AccountService
和CustomerService
类
如果客户说clientA
已将用户的名字设置为CustomerService类中的“UserA”,并且一段时间后它会从AccountService类中检索第一个名称,
第二个问题:它是否以“UserA”作为名字获得UserDetails的相同实例?
第三个问题:同时,如果另一位客户说clientB
试图获取AccountService类中的第一个名称,它会获得“UserA”吗?
第四个问题:同一个UserDetails实例是否会被clientA,clientB和其他人共享?如果是:选择原型,请求或会话的范围。
我希望你理解我的观点。请解释一下关于Web应用程序的spring bean范围。
感谢
答案 0 :(得分:2)
是单例是Web应用程序的默认范围。因此,您在所有服务(以及所有用户)中获得相同的UserDetails实例。
适合自己的范围取决于您的确切需求。您真的想将数据传输对象注入服务吗?这个物体应该存在多久?
答案 1 :(得分:1)
默认情况下,spring bean的范围是singleton,表示每个容器一个实例。 但这并不意味着所有请求都使用相同的实例。
就像这样。
客户端A请求bean A,容器将查找该Bean A的实例,如果该实例不可用,它将创建一个实例,然后将其提供给客户端A.
但是如果另一个客户端B正在使用bean A,那么客户端A必须等到客户端B释放bean A.