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 条评论
登录 后参与评论

相关文章

来自专栏好好学java的技术栈

java后端开发每天遇到的jsp,了解一下

JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码(在<%%>不能定义方法)。语法:<%多行java代码 %>

1612
来自专栏你不就像风一样

史上超全面的Elasticsearch使用指南

elasticsearch简写es,es是一个高扩展、开源的全文检索和分析引擎,它可以准实时地快速存储、搜索、分析海量的数据。

1.1K2
来自专栏青玉伏案

iOS开发之SQLite-C语言接口规范(一)——Ready And Open Your SQLite

  为什么要搞一搞SQLite的C语言接口规范呢? 因为在做iOS开发中难免会遇到操作数据库的情况,你可以使用第三方的FMDB等,或者使用CoreData。但我...

2145
来自专栏从零开始学自动化测试

python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)

前言 今天小编YOYO请xiaoming和xiaowang吃火锅,吃完火锅的时候会有以下三种场景: - 场景一:小编(主)先吃完了,xiaoming(客)和xi...

3466
来自专栏扎心了老铁

springboot mybatis 事务管理

本文主要讲述springboot提供的声明式的事务管理机制。 一、一些概念 声明式的事务管理是基于AOP的,在springboot中可以通过@Transacti...

4557
来自专栏更流畅、简洁的软件开发方式

其实添加数据也可以这样简单——表单的第一步抽象(针对数据访问层)《怪怪设计论: 抽象无处不在 》有感

更正: 不好意思,昨天晚上思路有点混乱。有几个前提忘记说明了,现在补充一下。 1、缩小范围。按照由简到难的思路,这里先讨论最简单的添加数据的情况。就是单表的添...

2148
来自专栏Java编程技术

使用数据库悲观锁实现不可重入的分布式锁

在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源...

651
来自专栏情情说

深入浅出MyBatis:「映射器」全了解

上一篇总结了MyBatis的配置,详细说明了各个配置项,其中提到了映射器,它是MyBatis最强大的工具,也是使用最多的工具。

3376
来自专栏Android相关

处理器结构--ReorderBuffer

Reorder Buffer用来保存在乱序执行之前的(OOOE)指令执行顺序,当指令集合在乱序执行后按照原有指令顺序将结果提交。

1144
来自专栏分布式系统进阶

Influxdb的Meta data分析

Influxdb定义了一个Service:Precreator Serivec(services/precreator/service.go),实现比较简单,周...

992

扫码关注云+社区