Spring自定义Bean的做用域scope

在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

https://blog.csdn.net/elim168/article/details/75581670

https://somefuture.iteye.com/blog/2293701

相关文章
相关标签/搜索