360SDN.COM

Spring Framework 5 权威指南(7)

来源:程序员阮威  2017-09-11 13:23:40    评论:0点击:

这是一个Spring 5专题系列,其诞生的动机是:

  1. 介绍最新的Spring Framework特性;

  2. 介绍最系统化的Spring Framework

  3. 介绍最佳实践的Spring Framework


6. BeanDefinition

要限定bean实例的作用域范围,可以为bean定义指定scope属性。SpringFramework支持6种开箱即用的作用域,其中4种只在web环境下的容器中可用(貌似去掉了globalSession,从Spring 3.0开始,thread作用域可用,但默认没有被注册),如下:

singleton作用域表示,每个指定了该作用域的bean定义在每个容器中只实例化一个bean实例。这是Spring的默认作用域。

XML的方式定义一个singleton作用域的bean,如下:

<bean id="accountService" class="com.foo.DefaultAccountService"/>

 

<!-- the following isequivalent, though redundant (singleton scope is the default) -->

<bean id="accountService" class="com.foo.DefaultAccountService"scope="singleton"/>

prototype作用域表示,每个指定了该作用域的bean定义在每次请求时都实例化一个新的bean实例,请求包括依赖注入时,以及通过getBean()获取时。

XML的方式定义一个prototype作用域的bean,如下:

<bean id="accountService" class="com.foo.DefaultAccountService"scope="prototype"/>

与其他的作用域相比,Spring并不管理prototype作用域的bean对象的完整生命周期。容器实例化一个prototype的对象交给客户端以后,就不再追踪这个实例,即bean的生命周期的初始化回调函数会被调用,但生命周期的销毁回调函数不会被调用。为了对这样的bean对象进行清理,可以使用自定义的BeanPostProcessor

通常作为规则,为有状态的bean对象指定prototype作用域,为无状态的bean对象指定singleton作用域。

requestsessionapplicationwebsocket四种作用域只在Web环境下的容器中可用(例如XmlWebApplicationContext)。要支持这四种作用域,根据环境需要进行一些配置:

如果你使用的是Spring MVC,则不需要任何配置,DispatcherServlet已经帮你配置好了。

如果你使用的不是Spring MVC,则需要在web.xml文件中添加如下配置:

<web-app>

       ...

       <listener>

                <listener-class>

              org.springframework.web.context.request.RequestContextListener

                </listener-class>

       </listener>

       ...

</web-app>

如果上面的配置有问题的话,那么尝试使用如下配置:

<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>

DispatcherServletRequestContextListenerRequestContextFilter做的是完全一样的事情,也就是将HTTP请求对象绑定到处理该请求的线程,使得这些bean对象在在后续的调用链中可用。

request作用域表示,每个指定了该作用域的bean定义为每个HTTP请求都实例化一个新的bean实例,请求处理完成后,bean实例被丢弃。其他的作用域以此类推。

XML的方式定义Web类作用域的bean,如下(@RequestScope/ @SessionScope / @ApplicationScope)

<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>

<bean id="userPreferences" class="com.foo.UserPreferences"scope="session"/>

<bean id="appPreferences" class="com.foo.AppPreferences"scope="application"/>

除了Spring提供的开箱即用的作用域以外,你还可以定义自己的作用域,甚至重新定义系统内置的作用域(不推荐这么做,singletonprototype也不允许重新定义)

定义一个作用域,先实现org.springframework.beans.factory.config.Scope接口,然后将其注册到Spring容器。以SimpleThreadScope为例(Spring提供,但默认没有被注册)

Scope threadScope = new SimpleThreadScope();

beanFactory.registerScope("thread", threadScope);

或者通过配置来进行注册,如下:

<?xml version="1.0"encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:aop="http://www.springframework.org/schema/aop"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

                http://www.springframework.org/schema/beans/spring-beans.xsd

                http://www.springframework.org/schema/aop

                http://www.springframework.org/schema/aop/spring-aop.xsd">

 

       <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">

                <propertyname="scopes">

                        <map>

                                <entry key="thread">

                                        <bean class="org.springframework.context.support.SimpleThreadScope"/>

                                </entry>

                        </map>

                </property>

       </bean>

 

       <bean id="bar" class="x.y.Bar" scope="thread">

                <propertyname="name"value="Rick"/>

                <aop:scoped-proxy/>

       </bean>

 

       <bean id="foo" class="x.y.Foo">

                <propertyname="bar"ref="bar"/>

       </bean>

 

</beans>

使用自定义的作用域的方式如下:

<bean id="..." class="..." scope="thread">

阅读原文

为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权