真实世界的bean范围用例

时间:2016-09-08 21:47:57

标签: spring

我正在学习Spring,我了解了bean范围 - 每个范围的实际用例是什么,我无法得到任何帮助。请帮助何时在Spring中使用Singleton,Prototype,Request和Session范围。

2 个答案:

答案 0 :(得分:9)

  • Singleton :它为每个Spring IoC容器返回一个bean实例。这个单实例存储在这样的单例bean的缓存中,并且该命名bean的所有后续请求和引用都返回缓存的对象。如果配置文件中未指定bean作用域,则单例是默认值。 真实世界示例:与数据库的连接

  • 原型:每次请求时都返回一个新的bean实例。它不存储像singleton这样的任何缓存版本。 真实世界示例:声明已配置的表单元素(配置为验证名称,电子邮件地址的文本框),并为每个正在创建的表单获取它们的“活动”实例

  • 请求:每个HTTP请求返回一个bean实例。 真实世界示例:仅在一个页面上有效的信息,例如搜索结果或订单确认。在重新加载页面之前,bean将一直有效。

  • 会话:每个HTTP会话返回一个bean实例(用户级会话)。 真实世界示例:在会话关闭时(通过超时或注销)保持身份验证信息失效。您也可以存储您不想在每次请求时重新加载的其他用户信息。

  • GlobalSession :每个全局HTTP会话返回一个bean实例。它仅在Web感知的Spring ApplicationContext(应用程序级会话)的上下文中有效。它类似于Session范围,实际上只在基于portlet的Web应用程序的上下文中才有意义。 portlet规范定义了构成单个portlet Web应用程序的所有各种portlet之间共享的全局Session的概念。在全局会话范围中定义的Bean绑定到全局portlet会话的生存期。

答案 1 :(得分:0)

每次您在ApplicationContext上调用getBean时,

原型都会创建一个全新的实例。而对于Request,仅为HttpRequest创建一个实例。因此,在单个HttpRequest中,我可以在Application上调用getBean两次,并且只会实例化一个bean,而在同一单个HttpRequest中,作用域为Prototype的同一个bean将获得2个不同的实例。

HttpRequest范围

Mark mark1 = context.getBean("mark"); 

Mark mark2 = context.getBean("mark"); 

mark1 == mark2; //This will return true 

原型范围

Mark mark1 = context.getBean("mark");

Mark mark2 = context.getBean("mark");

mark1 == mark2; //This will return false