在spring框架中支持五种做用域,分别以下:git
Singleton:在Spring IOC 容器仅存在一个Bean实例,Bean以单例方式存在,这个是默认值
prototype:每次从容器调用bean时,都会返回一个新的实例,也就是每次调用getBean()时都会实例化一个新的bean
request:request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
session:session做用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
Global Session:global session做用域相似于标准的HTTP Session做用域,不过它仅仅在基于portlet的web应用中才有意义github
通常咱们是不用自定义做用域的,可是Spring提供了这样的功能,因此了解一下,代码参考Spring5-Design-Patternsweb
做用域由接口org.springframework.beans.factory.config.Scope
定义,因此咱们须要实现这个接口,这个接口有如下几个方法spring
而后而后实现这个Scope接口session
而后配置一下这个自定义scope做用域,固然咱们也可使用代码的方式,经过经常使用的ApplicationContext,如ClassPathXmlApplicationContext等的getBeanFactory()方法就能获取到对应的BeanFactory对象,而后进行注册。框架
在CustomScopeConfigurer中主要的属性有Map<String, Object> scopes,主要的实现方法就是在beanFactory中注册scope,这里遍历map用的是entrySet测试
由于咱们以前用的是ThreadLocal,因此来写点代码测试一下.net
日志输出:prototype
这里能够看到建立的对象Mybean和Mybean2是同一个对象,而另起一个线程建立的对象就不是同一个对象啦。线程
咱们来看看Spring的AbstractRequestAttributesScope类,其中SessionScope和RequestScope继承该类,能够看到在remove中删除的时候,获取须要传入getScope()参数,请求的数据来自RequestContextHolder设置的
参考:
git@github.com:PacktPublishing/Spring5-Design-Patterns.git