↑↑ 点击上方关注「陈树义」↑↑
这是陈树义的第 048 期分享
作者 l 陈树义
来源 l 陈树义(ID:Spark-tree)
转载请联系授权(ID:Spark-tree)
当在 Spring 中定义一个 时,你必须声明该 bean 的作用域的选项。例如,为了强制 Spring 在每次需要时都产生一个新的 bean 实例,你应该声明 bean 的作用域的属性为 prototype。同理,如果你想让 Spring 在每次需要时都返回同一个bean实例,你应该声明 bean 的作用域的属性为 singleton。
Spring 框架支持以下五个作用域:
singleton作用域
如果一个 bean 的作用域被声明为 singleton,那么 Spring IoC 容器将只创建一个该对象的实例,并将其存储在缓存中。每次请求该 bean 时,都会返回该缓存对象。Singleton 作用域是所有 bean 的默认作用域。
prototype作用域
如果一个 bean 的作用域被声明为 prototype,那么每次请求该 bean 时,Spring IoC 都会返回一个新的实例。
request作用域
该作用域只在 Spring ApplicationContext 的上下文中有效。如果一个 bean 的作用域被声明为 request,就表示其只在此次请求内有效。
对于 request 作用域,查看如下Bean定义:
<bean id="loginAction" class="com.abc.LoginAction" scope="request" />
针对每次HTTP请求,Spring 器会根据 LoginAction 定义创建一个全新的 LoginAction 实例,且该 LoginAction 实例仅在当前 HTTP Request 内有效。如果程序需要,完全可以自由更改 Bean 实例的内部状态,其他请求所获得的loginAction 实例无法感觉到这种内部状态的改变。当处理请求结束时,request 作用域的 Bean 将会被销毁。
session作用域
该作用域只在 Spring ApplicationContext 的上下文中有效。如果一个 bean 的作用域被声明为 session,就表示其只在此次会话(session)内有效。
session 用域与 request 作用域完全类似,区别在于:request 作用域的 Bean对于每次 HTTP 请求有效,而 session 作用域的 Bean 对于每次 Session 有效。即如果用户没有关闭浏览器,那么后一次请求可以得到上一次请求的信息。
global-session作用域
该作用域与 session 类似,但是与 session 作用域的区别是什么,暂时没弄清楚。有了解的同学可以交流一下。
总结
在实际使用中,其实使用最多的还是 singleton 和 prototype 这两个作用域。至于 request、session、global-session 稍微了解下就可以了。
推荐阅读
公众号@陈树义,作者陈树义。聚焦Java程序员的技术成长,用最简单的语言,让复杂的技术不再难懂。
↑↑你的转发就是对我写作最好的鼓励↑↑