Listing A Controller Mapped by a Bean Name
<bean class="com.apress.expertspringmvc.flight.web.HomeController" name="/home"></bean> <property name="flightService" ref="flightService"></property>
■注释: Prototype bean 是一种非单例(non-singleton)的bean. 任何一次调用ApplicationContext的getBean()方法时都会返回一个新的Bean实例更多的信息请参照
BeanNameUrlHandlerMapping的另外一个问题存在于在你的应用程序中应用拦截(interceptor). 因为请求的映射(handler mapping )和Bean(beans imapping)的映射给绑定在一起了,没有分开,这样就不可能在Controller和拦截之间创建复杂的关系。如果有复杂的请求映射需求,你可以用SimpleUrlHandlerMapping 来代替BeanNameUrlHandlerMapping. SimpleUrlHandlerMapping作为BeanNameUrlHandlerMapping的另外一种选择,SimpleUrlHandlerMapping直指BeanNameUrlHandlerMapping的两大软肋.它可以映射 prototype类型的请求处理器,并且它允许你为处理器(handlers)和拦截器(interceptors)之间创建复杂灵活的映射
路径的映射算法与BeanNameUrlHandlerMapping是使用相同的基础组件,所以这个模式依然是映射URL到请求处理器的(request handler) ,你简单的在ApplicationContext中声明一下,就可以使用SimpleUrlHandlerMapping了. DispatcherServlet会根据类型找到的,并且不会创建默认的映射器了(BeanNameUrlHandlerMapping).意思就是,如果你想两个都用,那么就要全部声明一下在ApplicationContext里.
■提示 DispatcherServlet会链式处理请求的(译者:依次处理请求,可以参照过滤器和GOF中的责任链模式),这样允许按照你的要求处理映射,映射处理器(Handler mappings )实现了Orderedr接口.
Listing SimpleUrlHandlerMapping Example
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"></bean> <property name="urlMap"> <entry value-ref="homeController" key="/home"></entry> </property> <bean class="com.apress.expertspringmvc.flight.web.HomeController" id="homeController"></bean> <property name="flightService" ref="flightService"></property>不幸的是,映射不同的URL到相同的请求处理器是要稍微麻烦一点的:),你必须要建立两个映射才可以。