前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring速查手册(二)——Bean的作用域

Spring速查手册(二)——Bean的作用域

作者头像
大闲人柴毛毛
发布2018-03-12 10:37:44
6220
发布2018-03-12 10:37:44
举报
文章被收录于专栏:大闲人柴毛毛

Bean的四种作用域

  • 单例(Singleton):整个应用中,只创建一个bean。
  • 原型(Prototype):每次注入或请求要给bean的时候都创建一个新的bean。
  • 会话(Session):每个session创建要给bean。
  • 请求(Request):每个WEB请求创建一个bean。

PS:Spring默认的bean是单例的!

使用会话/请求作用域的注意点

代码语言:javascript
复制
// 创建一个session的bean
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION)
public A a{ …… }

// 在单例bean中注入不同作用域的bean
@Component
public B b{
    @Autowired
    public void setA ( A a ) { …… }
}

上述代码会发生错误! 单例的bean在应用程序启动的时候就初始化,并在初始化时需要注入session作用域的B,但session作用域的bean只有当有用户的时候才创建,初始化的时候并没有该对象。 再者,不同的用户拥有不同的session,因此A对象将有成千上万,而B对象有且仅有一个。 此时需要在session作用域的bean对象上加上注解:

代码语言:javascript
复制
// 创建一个session的bean
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,
proxyMode=ScopeProxyMode.INTERFACES)
public A a{ …… }

该注解声明后,注入给单例的将是该bean的代理,代理维护着不同session下的bean,当单例对象调用的将是代理对象,代理对象根据当前的session将请求转发给制定的目标对象处理。

注意:若session作用域的对象无接口,则使用Cglib创建代理

代码语言:javascript
复制
// 创建一个session的bean
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,
proxyMode=ScopeProxyMode.TARGET_CLASS)
public A a{ …… }

在XML中开启对象代理

代码语言:javascript
复制
<!-- 开启java动态代理-->
<bean id="xxx" class="com.xxx.xxx" scope="session">
    <aop:scoped-proxy />
</bean>
代码语言:javascript
复制
<!-- 开启Cglib代理-->
<bean id="xxx" class="com.xxx.xxx" scope="session">
    <aop:scoped-proxy proxy-target-class="false" />
</bean>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年05月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Bean的四种作用域
  • 使用会话/请求作用域的注意点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档