SSM 是 Spring + Spring MVC + MyBatis 的缩写,是 Java 企业级开发中经典的三层架构组合框架,广泛用于开发中小型企业级应用。三者分工明确、协同工作,形成了 "业务层 + 表现层 + 数据访问层" 的完整解决方案。
一、SSM 各组件的角色与核心功能
1. Spring(业务层框架)
- 核心定位:负责全局的对象管理(IOC)和切面编程(AOP),是 SSM 的 "胶水",整合其他框架。
- 核心功能 :
- IOC(控制反转):通过容器统一管理对象的创建、依赖注入和生命周期,降低类之间的耦合。
- AOP(面向切面编程):将日志、事务、权限等横切逻辑抽离为切面,与业务逻辑解耦。
- 事务管理 :通过声明式事务(
@Transactional
)简化事务控制,保证数据一致性。
- 核心组件 :
ApplicationContext
:IOC 容器的核心实现。@Component
、@Service
、@Autowired
:用于对象注册和依赖注入。@Aspect
、@Transactional
:用于 AOP 和事务管理。
2. Spring MVC(表现层框架)
- 核心定位:处理 Web 请求,负责前端与后端的交互,是 MVC 设计模式的实现。
- MVC 角色分工 :
- Model(模型) :封装业务数据(如
User
、Order
实体类)。 - View(视图):展示数据(如 JSP、Thymeleaf 页面)。
- Controller(控制器) :接收请求、调用业务逻辑、返回结果(如
@Controller
标注的类)。
- Model(模型) :封装业务数据(如
- 核心功能 :
- 请求映射 :通过
@RequestMapping
等注解将 URL 与控制器方法绑定。 - 参数绑定 :自动将请求参数转换为 Java 对象(如表单数据 →
User
对象)。 - 视图解析 :将控制器返回的逻辑视图名解析为实际视图(如
index
→WEB-INF/index.jsp
)。 - 拦截器:对请求进行前置 / 后置处理(如登录验证、日志记录)。
- 请求映射 :通过
- 核心组件 :
DispatcherServlet
:前端控制器,统一处理所有请求,分发到对应控制器。@Controller
、@RequestMapping
、@RequestParam
:用于请求处理。ViewResolver
:视图解析器,负责视图定位。
3. MyBatis(数据访问层框架)
- 核心定位:简化数据库操作,实现 Java 对象与数据库表的映射(ORM),替代传统 JDBC。
- 核心功能 :
- SQL 映射:通过 XML 或注解定义 SQL 语句,将查询结果映射为 Java 对象。
- 参数映射 :自动将 Java 对象的属性映射为 SQL 参数(支持
#{}
占位符,防止 SQL 注入)。 - 事务支持:与 Spring 的事务管理整合,保证数据操作的原子性。
- 核心组件 :
SqlSessionFactory
:创建SqlSession
的工厂(依赖数据源配置)。SqlSession
:执行 SQL 的核心接口(提供selectOne
、insert
等方法)。Mapper 接口
:定义数据操作方法,与 XML 映射文件关联(无需实现类,MyBatis 动态代理生成)。- 映射文件(如
UserMapper.xml
):存放 SQL 语句,定义参数和结果映射规则。
二、SSM 工作流程(请求处理全链路)
- 用户发起请求 :浏览器发送 HTTP 请求(如
http://localhost:8080/user/1
)。 - Spring MVC 接收请求 :
- 请求被
DispatcherServlet
拦截,根据 URL 匹配@RequestMapping
找到对应的Controller
方法(如UserController.getUser(1)
)。
- 请求被
- 调用业务逻辑 :
Controller
方法通过@Autowired
注入Service
层对象(如UserService
),调用其业务方法(如userService.findById(1)
)。Service
层可能包含事务注解(@Transactional
),Spring 自动管理事务。
- 数据访问操作 :
Service
调用Mapper
接口(如UserMapper.selectById(1)
),MyBatis 通过SqlSession
执行映射文件中的 SQL(如select * from user where id = ?
)。- 数据库返回结果,MyBatis 将结果集映射为
User
对象,返回给Service
。
- 处理结果返回 :
Service
将User
对象返回给Controller
。Controller
将数据放入模型(Model
),返回视图名(如userInfo
)。
- 渲染视图 :
ViewResolver
将视图名解析为实际视图(如WEB-INF/views/userInfo.jsp
),渲染页面并返回给浏览器。
三、SSM 整合核心配置
SSM 整合需通过配置文件协调三者的工作(以 XML 配置为例,也可使用注解配置):
1. Spring 配置(applicationContext.xml
)
<!-- 扫描 Service 层组件 -->
<context:component-scan base-package="com.example.service"/>
<!-- 数据源配置(连接池) -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- MyBatis 的 SqlSessionFactory 整合 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/> <!-- 映射文件路径 -->
<property name="typeAliasesPackage" value="com.example.pojo"/> <!-- 实体类包 -->
</bean>
<!-- 扫描 Mapper 接口,生成代理对象 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启声明式事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
2. Spring MVC 配置(spring-mvc.xml
)
<!-- 扫描 Controller 层组件 -->
<context:component-scan base-package="com.example.controller"/>
<!-- 开启 MVC 注解驱动(支持 @RequestMapping 等) -->
<mvc:annotation-driven/>
<!-- 视图解析器(JSP 为例) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/> <!-- 视图前缀 -->
<property name="suffix" value=".jsp"/> <!-- 视图后缀 -->
</bean>
<!-- 静态资源放行(如 CSS、JS、图片) -->
<mvc:default-servlet-handler/>
3. Web 配置(web.xml
)
<!-- Spring 容器初始化 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring MVC 前端控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup> <!-- 启动时加载 -->
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern> <!-- 拦截所有请求 -->
</servlet-mapping>
四、SSM 代码示例(核心层)
1. 实体类(Model)
public class User {
private Integer id;
private String name;
private Integer age;
// getters and setters
}
2. Mapper 接口(数据访问层)
public interface UserMapper {
// 方法名与映射文件中的 SQL id 对应
User selectById(Integer id);
}
3. MyBatis 映射文件(UserMapper.xml
)
<mapper namespace="com.example.mapper.UserMapper">
<!-- 查询用户 -->
<select id="selectById" parameterType="int" resultType="User">
select id, name, age from user where id = #{id}
</select>
</mapper>
4. Service 层(业务逻辑)
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional // 声明事务
public User findById(Integer id) {
return userMapper.selectById(id);
}
}
5. Controller 层(请求处理)
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/{id}")
public String getUser(@PathVariable Integer id, Model model) {
User user = userService.findById(id);
model.addAttribute("user", user); // 存入模型
return "userInfo"; // 返回视图名(对应 WEB-INF/views/userInfo.jsp)
}
}
五、SSM 的优缺点
优点
- 分工明确:Spring 管业务,Spring MVC 管 Web,MyBatis 管数据库,架构清晰。
- 灵活性高:MyBatis 允许手写 SQL,适合复杂查询场景;Spring 的 IOC/AOP 降低耦合。
- 成熟稳定:三者均是经过长期验证的框架,社区活跃,资料丰富。
缺点
- 配置繁琐:需要编写大量 XML 配置(可通过注解优化,但仍比 Spring Boot 复杂)。
- 开发效率:相比 Spring Boot 的 "开箱即用",SSM 整合和配置耗时较长。
- 学习成本:需掌握三个框架的细节,对新手不够友好。
六、SSM 与 Spring Boot 的关系
- Spring Boot 是 SSM 的简化:Spring Boot 整合了 SSM 的核心功能,并通过 "自动配置" 消除了繁琐的 XML 配置,内置服务器,简化了开发和部署。
- 替代与兼容:新项目更推荐 Spring Boot,但 SSM 的核心思想(IOC、AOP、MVC)在 Spring Boot 中完全继承,掌握 SSM 后容易迁移到 Spring Boot。
总结
SSM 是 Java 企业级开发的经典组合,通过 Spring 的对象管理、Spring MVC 的 Web 交互和 MyBatis 的数据库操作,形成了完整的三层架构解决方案。尽管配置相对繁琐,但其灵活性和稳定性使其在中小型项目中仍被广泛使用。对于新手,学习 SSM 有助于理解 Java 后端开发的核心思想,为后续学习 Spring Boot、微服务等技术打下基础。