周其仁:停止改革,我们将面临三大麻烦

抛开立场观点不谈,且看周小平写一句话能犯多少语病

罗马尼亚的声明:小事件隐藏着大趋势——黑暗中的风:坚持做对的事相信未来的结果

布林肯突访乌克兰,为何选择去吃麦当劳?

中国不再是美国第一大进口国,贸易战殃及纺织业? 美国进一步延长352项中国商品的关税豁免期

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

Spring Bean 的四个作用域,新手必看!

陈树义 树哥聊编程 2022-10-25

↑↑ 点击上方关注「陈树义」↑↑



这是陈树义的第 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 的默认作用域。

<!-- A bean definition with singleton scope -->
<bean id="..." class="..." scope="singleton">
    <!-- collaborators and configuration for this bean go here -->
</bean>

prototype作用域

如果一个 bean 的作用域被声明为 prototype,那么每次请求该 bean 时,Spring IoC 都会返回一个新的实例。

<!-- A bean definition with singleton scope -->
<bean id="..." class="..." scope="prototype">
   <!-- collaborators and configuration for this bean go here -->
</bean>

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程序员的技术成长,用最简单的语言,让复杂的技术不再难懂。


↑你的转发就是对我写作最好的鼓励↑↑


文章有问题?点此查看未经处理的缓存