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

Bean的四种作用域

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

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

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

// 创建一个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对象上加上注解:

// 创建一个session的bean
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,
proxyMode=ScopeProxyMode.INTERFACES)
public A a{ …… }

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

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

// 创建一个session的bean
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,
proxyMode=ScopeProxyMode.TARGET_CLASS)
public A a{ …… }

在XML中开启对象代理

<!-- 开启java动态代理-->
<bean id="xxx" class="com.xxx.xxx" scope="session">
    <aop:scoped-proxy />
</bean>
<!-- 开启Cglib代理-->
<bean id="xxx" class="com.xxx.xxx" scope="session">
    <aop:scoped-proxy proxy-target-class="false" />
</bean>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Pythonista

vim与程序员

所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。

992
来自专栏Java技术栈

Spring bean - scope详解

Scope是定义Spring如何创建bean的实例的。 在创建bean的时候可以带上scope属性,scope有下面几种类型。 Singleton 这也是Spr...

26411
来自专栏python学习路

三、scrapy后续 LinkExtractorsrules Logging发送POST请求内置设置参考手册

CrawlSpiders 通过下面的命令可以快速创建 CrawlSpider模板 的代码: scrapy genspider -t crawl tencent ...

3994
来自专栏古时的风筝

BTrace : Java 线上问题排查神器

BTrace 是什么 BTrace 是检查和解决线上的问题的杀器,BTrace 可以通过编写脚本的方式,获取程序执行过程中的一切信息,并且,注意了,不用重启服务...

3728
来自专栏Spring相关

第7章—SpringMVC高级技术—处理异常

不管发生什么事情,不管是好的还是坏的,Servlet请求的输出都是一个Servlet响应。如果在请求处理的时候,出现了异常,那它的输出依然会是Servlet响应...

964
来自专栏Java技术栈

Intellij Idea非常6的10个姿势!

1、智能IDE 自动提示你可能要定义的变量及类的类型。 Maven dependency自动提示本地已经有的依赖。 类或者方法显示具体的参数名称。 CTRL +...

2754
来自专栏张善友的专栏

Enterprise Library 4 数据访问应用程序块

Enterprise Library 数据访问应用程序块简化了实现常规数据访问功能的开发任务。应用程序可以在各种场景中使用此应用程序块,例如为显示而读取数据、传...

2866
来自专栏Java帮帮-微信公众号-技术文章全总结

day27.MongoDB【Python教程】

集合:类似于关系数据库中的表,储存多个文档,结构不固定,如可以存储如下文档在一个集合中

873
来自专栏企鹅号快讯

indexedDB 基本使用

来源:党黎明 mr-dang.github.io/javascript/2017/12/09/indexedDB基本使用.html indexedDB 简介...

23010
来自专栏一“技”之长

Xcode中修改变量名、类名及字符串的替换操作

        在做iOS开发代码优化的工作时,优化代码结构之前,我们应该先整理好工程的外貌,将文件和类的命名进行规范,在Xcode中为我们提供了方便而强大的名...

592

扫码关注云+社区