Spring的Sope是什么
Scope,也称作用域,在 Spring IoC 容器是指其创建的 Bean 对象相对于其他 Bean 对象的请求可见范围。在 Spring IoC 容器中具有以下几种作用域:基本作用域(singleton、prototype),Web 作用域(reqeust、session、globalsession),自定义作用域。
singleton
即ConfigurableBeanFactory.SCOPE_SINGLETON
,单例模式,也为默认模式;prototype
即ConfigurableBeanFactory.SCOPE_PROTOTYPE
,多例模式;request
即WebApplicationContext.SCOPE_REQUEST
,表示在一次http请求中,被注解的Bean都是同一个Bean,不同的请求是不同的Bean;sesson
即WebApplicationContext.SCOPE_SESSION
,表示在一次http会话中,被注解的Bean都是同一个Bean,不同的会话是不同的Bean;
prototype陷阱
正常情况下singleton
为单例,prototype
为多例,若直接在入口位置即使用prototype
属性,那么对应的实例确实会有多个。但是若prototype
修饰的类对象为其他singleton
修饰的对象对应的属性,则prototype
起不到真正的想要结果。因为本应该为多例的对象,被单例对象首次加载的时候已经赋予在内存里.
@Scope(“prototype”)的正确用法——解决Bean的多例问题
Spring中原型prototype的准确使用
但实际上prototype
并不是不对,也不是出了问题,而是我们的使用方式有问题。
如何处理prototype属性不起效的问题
- 正常情况下,直接使用
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
或@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
,可以实现真正的多例模式。但是若业务内存在异步操作,且请求相关的http丢失,则会报错.