一、背景
目前项目组都在用SSM(spring+springMVC+mybatis)开发项目
大家基本都停留在框架的基本使用阶段,对框架的职责并不清晰,导致配置文件出现了不少问题
在这简单讲解一下spring、springMVC在项目中各自负责的工作
二、spring、springMVC的关系
spring粗略可分为五个模块
1、bean容器,负责bean的创建、管理,其中包括了依赖注入功能
2、aop模块,切面编程,降低应用耦合的好方式
3、数据访问与集成,提供语义丰富的异常层(可迅速理解数据库操作抛出的错误),提供事务管理,JMS封装
4、web和远程调用,集成了其它MVC框架并提供了自己的MVC框架(springMVC),集成RMI等远程服务调用服务,并自带了远程调用框架(HTTP invoker)
5、测试
由spring的模块划分可看到
在代码层次上:springMVC属于spring代码的一部分
在实际使用中:springMVC被独立为一个jar包,如不引用,将没有这个功能
故,可以将其看作两个类库
三、项目中主要用到的spring、springMVC功能
项目中主要用到的spring功能:
1、依赖注入(这里包括了bean的创建)
2、aop编程
3、事务管理
项目中主要用到的springMVC的功能:
1、创建控制器类
2、请求映射,根据URI(可不负责任的理解为相对路径)调用相应的action
3、数据绑定,如表单数据绑定为action参数
4、解析视图,向视图传递数据
项目中主要用到的spring功能和springMVC功能有重合部分
spring创建了所有的bean,包括控制器类,而springMVC也要创建控制器类
这里处理不好将会出现创建两次bean的情况,严重则会出现aop、事务失效
四、正确的spring、springMVC配置
spring负责bean的创建(@controller除外),bean依赖的管理、aop、事务、ORM的集成
故配置文件applicationContext.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- 加载系统配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:property/init.properties</value> </list> </property> </bean> <!-- 自动检测bean.不包括@Controller(交由mvc检测) --> <context:component-scan base-package="com.xjyh" > <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!-- 开启AOP --> <aop:aspectj-autoproxy expose-proxy="true"/> <!-- mybtis配置 --> <import resource="spring-mybatis.xml"/> <!-- 对数据源进行事务管理,数据源配置在spring-mybatis.xml中 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置注解事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> </beans>
而springMVC,负责了创建控制器类、请求映射、数据绑定、解析视图、向视图传递数据