spring 创建实体bean的范围
程序员文章站
2022-04-17 14:36:55
...
(个人笔记,如有不足之处,谢谢指正)在spring3.0.6中,spring提供了5中scope,分别是singleton、prototype、request、session、global session。这5种是已经被注册的,还有一种thread scope是没有被注册的。spring 3.0也提供了相应的方法来注册某种scope或这自定义相应的scope。下面针对已经提供的几种scope逐一介绍一下:
1、singleton:它是在spring容器中只有一个实例。在设计模式中讲到的单例模式,他是相对于某个classLoader存在的。在spring中配置相应的实体时,如果没有定义scope属性,默认的是采用singleton。例如:<bean id="personService" class="com.zb.PersonService"/>与<bean id="personService" class="com.zb.PersonService" scope="singleton"/>效果是一样的。
2、prototype:这种scope在注入到其他实体中或者在程序中通过getBean()获得的实体都是不同的。这用scope应用,在spring中有如下说明:As a rule, use the prototype scope for all stateful beans and the singleton scope for stateless beans.(一般来说,prototype应用与状态性的实体,而singleton应用于无状态的实体中)。
在使用这种scope的时候,他会占用大量的系统资源。所以这需要定期的对它占用的资源进行清理。
注:在singleton实例中注入prototype实例时,依赖关系是在初始化的时候就确定了,一旦将prototype的实例注入到实例中,那么当前prototype实例会一直服务于singleton实例。如果想在运行是singleton能够获得不同的prototype实例,则需要用到“方法注入(Method injection)”
3、request 、session、global session
在使用这些scope的时候需要做一些必要的配置,当然这些配置对singleton和prototype并不是必须的。
如果在web项目中使用了spring的mvc,则就不需要相关配置了。因为spring Mvc 的request请求是Spring DispatcherServlet, or DispatcherPortlet来处理的。Spring DispatcherServlet, or DispatcherPortlet暴露了所有的相关状态。
如果是使用了serlvet2.4以上的容器,所有的请求并没有使用Spring的DispatcherServlet,例如jsf,struts,这是就需要在web.xml中配置监听器javax.servlet.ServletRequestListener,配置如下:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
如果是使用的web容器是低版本的,如servlet2.3,则需要把下面的配置加入到web.xml中:<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>
global session只能应用在portlet类的项目中。
1、singleton:它是在spring容器中只有一个实例。在设计模式中讲到的单例模式,他是相对于某个classLoader存在的。在spring中配置相应的实体时,如果没有定义scope属性,默认的是采用singleton。例如:<bean id="personService" class="com.zb.PersonService"/>与<bean id="personService" class="com.zb.PersonService" scope="singleton"/>效果是一样的。
2、prototype:这种scope在注入到其他实体中或者在程序中通过getBean()获得的实体都是不同的。这用scope应用,在spring中有如下说明:As a rule, use the prototype scope for all stateful beans and the singleton scope for stateless beans.(一般来说,prototype应用与状态性的实体,而singleton应用于无状态的实体中)。
在使用这种scope的时候,他会占用大量的系统资源。所以这需要定期的对它占用的资源进行清理。
注:在singleton实例中注入prototype实例时,依赖关系是在初始化的时候就确定了,一旦将prototype的实例注入到实例中,那么当前prototype实例会一直服务于singleton实例。如果想在运行是singleton能够获得不同的prototype实例,则需要用到“方法注入(Method injection)”
3、request 、session、global session
在使用这些scope的时候需要做一些必要的配置,当然这些配置对singleton和prototype并不是必须的。
如果在web项目中使用了spring的mvc,则就不需要相关配置了。因为spring Mvc 的request请求是Spring DispatcherServlet, or DispatcherPortlet来处理的。Spring DispatcherServlet, or DispatcherPortlet暴露了所有的相关状态。
如果是使用了serlvet2.4以上的容器,所有的请求并没有使用Spring的DispatcherServlet,例如jsf,struts,这是就需要在web.xml中配置监听器javax.servlet.ServletRequestListener,配置如下:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
如果是使用的web容器是低版本的,如servlet2.3,则需要把下面的配置加入到web.xml中:<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>
global session只能应用在portlet类的项目中。