前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring bean的作用域

spring bean的作用域

作者头像
用户1418372
发布2018-09-13 10:23:19
1.2K0
发布2018-09-13 10:23:19
举报
文章被收录于专栏:清晨我上码清晨我上码

Bean的作用域 参考:spring FrameWork官方文档 spring4.x中官方有7中作用域,如果使用的是applicationContext作为容器的话就只用5中作用域 下面的其中作用域为

spring4.x的七种作用域

下面讲解平常使用applicationContext作为容器的中为5中作用域,分别为singleton(单例)、prototype(原型)、request、session和global session,5种作用域说明如下: singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean定义为singleton模式

单例模式

prototype:原型模式,每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而singleton全局只有一个对象。根据经验,对有状态的bean使用prototype作用域,而对无状态的bean使用singleton作用域。

原型

request,session,globalSession,application, 和websocket这几种作用域使用的范围 web-aware Spring中ApplicationContext接口(例如XmlWebApplicationContext).有效。 在使用下面几种方式的时候,需要注意的是除了需要在设置bean的scope,还需要根据servlet容器不同来考虑。如果使用了Spring Web MVC 中Spring DispatcherServletor DispatcherPortlet,已经设置好了相应的作用域,如果是使用的 Servlet 2.5 web 容器请求不是使Spring的DispatcherServlet(例如使用, JSF或者 Struts),需要注册到监听器中。如果是servlet3.0需要通WebApplicationInitializer接口编程实现。当然如果更老的容器添加如下配置到web.xml申明使用。

代码语言:javascript
复制
<web-app>
    ...
    <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>
    ...
</web-app>

或者如果使用监听设置有问题的话也可以使用过滤Spring’s RequestContextFilter, spring的过滤。这个过滤器的映射和你的配置有关,必要的时候需要做一定的调整。配置:

代码语言:javascript
复制
<web-app>
    ...
    <filter>
        <filter-name>requestContextFilter</filter-name>
        <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>requestContextFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    ...
</web-app>
  • DispatcherServlet, RequestContextListener, 和RequestContextFilter 准确的说所做的事相同,换句话说就是绑定HTTP请求对象到要为该请求服务的线程中去 。这样创建的 bean就是 request- 和session-scoped的作用域, 提供下一步调用链。

  • 下面几种作用域提供两种配置 request:在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效。,针对每一次Http请求,Spring容器根据该bean的定义创建一个全新的实例,且该实例仅在当前Http请求内有效,而其它请求无法看到当前请求中状态的变化,当当前Http请求结束,该bean实例也将会被销毁。
代码语言:javascript
复制
<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>
代码语言:javascript
复制
@RequestScope
@Component
public class LoginAction {
    // ...
}

session:在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。 ,同Http请求相同,每一次session请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的session请求内有效,请求结束,则实例将被销毁。

代码语言:javascript
复制
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
代码语言:javascript
复制
@SessionScope
@Component
public class UserPreferences {
    // ...
}

global Session:在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。

代码语言:javascript
复制
<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.09.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档