技术帮
 

Spring Bean的作用域

本网站内容基本都是原创作品,未得到作者同意也欢迎转载
转载请注明出处:技术帮
说你呢,赶紧长按二维码,然后点击识别图中二维码

任何技术难题可进QQ群提问:【小崔说编程
对于提问的原则是:没有你不能问的,只有我不会答的

1472955908895017376.png说两句


首先要强调一下,Spring的作用域在实际工作中其实很少需要区分的,也就是说大多数使用Spring的Bean都是使用其默认的单例模式的,不需要考虑其他作用域的问题。不过如果特殊场景需要每个用户拥有一份独立的Bean对象的时候,就要考虑作用域了。

1473058358717068189.png 首先说一下,作用域有几种:

singleton:单例的,这是最常用的。每个Bean都是唯一的一份,大家共享使用。

在这样的作用域下一定要注意不要使用类的成员变量。因为作为面向对象的类封装的就是两个东西:数据和算法,数据就是成员变量,算法就是方法。算法无所谓,大家共用是可以的,但数据如果共用就麻烦了,数据非错乱不可。

prototype:多例的,相当于是new出来的对象。这种情况下,成员变量随便用。

request:每次Http的Request都是一份Bean对象。基本也可以当做多例用,与prototype细节区别很少,但相对比prototype会更少消耗资源,毕竟在一次请求只new出来一份,而prototype是可能new出来多份。

当然,实际情况中,大多数一次request对一个类也就注入一次,不会重复注入多次,也就是new出来一次。

session:这个是针对Http session只有一份Bean对象,当然要求程序是基于web的Spring ApplicationContext,也就是说一个用户访问网站的过程中,自己总是用一份Bean对象。

global session:这种session不是普通的http的session,是一种新标准的web应用程序,叫portlet应用。一般基于tomcat的应用程序就不用考虑这种作用域了,新版本的tomcat是支持这种应用程序的。


 作用域的配置

singleton的配置:

<bean id="role" class="com.wskj.app.Role" scope="singleton"/>

或者

<bean id="role" class="com.wskj.app.Role" singleton="true"/>

prototype的配置:

<bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/>

或者

<beanid="role" class="spring.chapter2.maryGame.Role" singleton="false"/>

request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置:

如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可:

<web-app>
  ...
  <listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>
  ...
</web-app>

如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现:

<web-app>
 ..
 <filter> 
    <filter-name>requestContextFilter</filter-name> 
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
 </filter> 
 <filter-mapping> 
    <filter-name>requestContextFilter</filter-name> 
    <url-pattern>/*</url-pattern>
 </filter-mapping>
  ...
</web-app>

至于Spring的bean配置中可参考singleton和prototype的写法。

注解方式

采用注解方式设置将更方便,毕竟在企业中大多数都是基于注解开发的。

注解方式只需要在类前增加@Scope注解即可。