SpringMVC学习 (五)

来源:互联网 发布:通用域名注册 编辑:程序博客网 时间:2024/06/02 10:02

springMVC与spring的整合

springMVC仅仅好比一个组件,而spring却是一个平台。spring平台可以用来整合springMVC、Hibernate,就像是面包板一样。

当然,在不使用spring的情况下,完全可以使用springMVC去整合其他组件,但是这样的话,就使得
springMVC无法专注于自己的web层框架了。毕竟,springMVC中带个“MVC”,它主要用来处理web相关的事务。

因此,项目工程中建议使用spring作为基础,整合各个组件。

如何整合

单独的springMVC基本只需要两个配置文件:web.xml和dispatcherServlet-servlet.xml文件。
前者配置了dispatcherServlet类和contextConfigLocation,即实现servlet对请求的过滤和对dispatcherServlet-servlet.xml的加载。
而具体的视图解析器InternalResourceViewResolver,default-servlet-handler,annotation-driven以及自定义的拦截器、格式转换器等等都是在dispatcherServlet-servlet.xml中配置的。
同时,还在其中配置了标签,对所有组件进行自动扫描。

如今有了spring就不应该让所有的组件被springMVC扫描,而是,除了跟Controller相关的组件之外,其他的组件改为——被spring扫描加载,比如@Service、@Component、@Entity等等。

如果两边都配置了component-scan,并且均为全路径扫描,必然导致所有的组件被初始化两次。
因此在springMVC的配置中(dispatcherServlet-servlet.xml)应该为:

<context:component-scan base-package="com.ghost.spring.employee"  use-default-filters="false">        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>    </context:component-scan>

而在spring的配置中(beans.xml)应该这样:

<context:component-scan base-package="com.ghost.spring.employee">        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>    </context:component-scan>

注意二者的写法不同。
前者中仅包含controller相关的东西,user-default-filters=“false”

而后者并不需要配user-default-filters,默认为true,即全路径扫描,仅仅是exclude跟Controller相关的组件。

如果扫描功能配置有误,则在服务启动过程中会爆出bean无法实例化或Autowired等等。

调用的大小关系

由于springMVC调用底层相关,即controller调用service,可以看出springMVC大于spring,前者可以调用后者的组件,而后者是无法调用前者的组件的。这一点应该牢记。

1 0
原创粉丝点击