我正在学习Spring,我了解了bean范围 - 每个范围的实际用例是什么,我无法得到任何帮助。请帮助何时在Spring中使用Singleton,Prototype,Request和Session范围。
答案 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)
原型都会创建一个全新的实例。而对于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