前言:++尽管我们以后要学Springboot,但是SpringMvc依旧是需要掌握的知识,他是Springboot的基础,学习他可以帮助我们更好的理解SPringboot的底层,而不是一味的"白雪"。况且面试题还会问到这两者的关系呢。不说废话了,这章我们要将前面学的三个框架放到一起工作(Spring SpringMVC,Mybatis)。++
++这里提一下,我在创建这个模块时,报了一个错,我的maven版本太过老旧好像是2019年的与 maven-archetype-plugin:3.4.1插件版本不兼容,这里提供更新的maven解压包,这样就解决了版本不兼容的问题https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip++
++下载解压后,不要忘记把原来旧版本maven的环境变量修改,最后在命令行中输入mvn -v(注意有个空格)检验版本是否是新版的3.6.3++
++如图所示:++

创建配置类:
src/main/java
├── com.example.config
│ ├── ServletContainersInitConfig (或者 MyWebAppInitializer)
│ ├── SpringConfig (根容器配置)
│ ├── SpringMvcConfig (Web层配置)
│ ├── MyBatisConfig (MyBatis整合配置)
│ └── JdbcConfig (数据库连接池配置)
1.ServletContainersInitConfig(或 MyWebAppInitializer)
作用 :替代 web.xml,启动容器,加载 Spring 和 SpringMVC 配置
继承 :AbstractAnnotationConfigDispatcherServletInitializer
2. SpringConfig(根容器配置)
作用 :Spring 核心配置,扫描除 Controller 以外的 Bean
注解 :@Configuration、@ComponentScan、@Import
java
@Configuration
@ComponentScan(basePackages = "com.example",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
))
@Import({JdbcConfig.class, MyBatisConfig.class})
public class SpringConfig {
// 可以配置一些全局的 Spring Bean
}
3. SpringMvcConfig(Web层配置)
作用 :SpringMVC 配置,扫描 Controller、视图解析器、静态资源等
注解 :@Configuration、@ComponentScan、@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "com.example.controller")
@EnableWebMvc // 启用 SpringMVC 注解驱动
public class SpringMvcConfig implements WebMvcConfigurer {
// 静态资源放行
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
// 视图解析器(如果使用 JSP)
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/pages/");
resolver.setSuffix(".jsp");
resolver.setOrder(0);
return resolver;
}
// JSON 转换器(如果使用 Jackson)
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
return new MappingJackson2HttpMessageConverter();
}
}
4. JdbcConfig(数据库连接池)
作用 :配置数据源(Druid、HikariCP 等)
注解 :@Configuration、@Bean、@PropertySource
@Configuration
@PropertySource("classpath:jdbc.properties") // 加载配置文件
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
jdbc.properties 文件:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
5.MyBatisConfig(MyBatis整合)
作用 :配置 SqlSessionFactory、Mapper 扫描等
注解 :@Configuration、@Bean、@MapperScan
@Configuration
public class MyBatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setTypeAliasesPackage("com.example.domain"); // 实体类包
// 配置 MyBatis 全局设置(可选)
org.apache.ibatis.session.Configuration configuration =
new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true); // 驼峰命名
factoryBean.setConfiguration(configuration);
return factoryBean;
}
// Mapper 扫描也可以在这里配置,或者在 SpringConfig 配置
或者直接在 SpringConfig 上添加 @MapperScan:
@Configuration
@ComponentScan(...)
@MapperScan(basePackages = "com.example.mapper") // 扫描 Mapper 接口
@Import({JdbcConfig.class, MyBatisConfig.class})
public class SpringConfig {
| 配置类 | 必选 | 作用 |
|---|---|---|
| ServletContainersInitConfig | ✅ | 启动容器,整合 Spring/SpringMVC |
| SpringConfig | ✅ | Spring 根容器(Service、Dao) |
| SpringMvcConfig | ✅ | SpringMVC 容器(Controller) |
| JdbcConfig | ✅ | 数据源配置 |
| MyBatisConfig | ✅ | MyBatis 整合配置 |
功能模块开发:
src/main/java
├── com.example
│ ├── controller # Controller层
│ │ └── UserController.java
│ ├── service # Service层
│ │ ├── UserService.java
│ │ └── impl
│ │ └── UserServiceImpl.java
│ ├── dao # Dao层(Mapper)
│ │ └── UserDao.java
│ ├── domain # 实体类
│ │ └── User.java
│ └── config # 配置类
│ ├── SpringConfig.java
│ └── ...
| 层级 | 类/文件 | 核心注解 | 主要职责 |
|---|---|---|---|
| Domain | User.java | 无 | 数据实体 |
| Dao | UserDao.java | @Mapper | 数据库操作接口 |
| Mapper | UserMapper.xml | 无 | SQL映射(可选) |
| Service | UserService.java | 无 | 业务接口 |
| ServiceImpl | UserServiceImpl.java | @Service | 业务实现 |
| Controller | UserController.java | @Controller | 请求处 |
测试顺序:
-
测试DAO层(单独测试MyBatis)
-
测试Service层(Spring容器)
-
测试Controller层(Postman)
-
前后端联调
异常处理:
客户端请求
↓
Controller层 (接收请求)
↓
Service层 (业务处理) ← 抛出异常
↓ ↓
↓ 异常向上传播
↓ ↓
Controller层 (没有try-catch)
↓ ↓
↓ 异常继续传播
↓ ↓
全局异常处理器 ← ← ← ← ← 捕获异常
↓
统一处理后返回给客户端
出现异常现象的常见位置与常见诱因如下:
框架内部抛出的异常:因使用不合规导致
数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)
表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)
工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)
项目异常处理方案
业务异常(BusinessException)
++发送对应消息传递给用户,提醒规范操作++
系统异常(SystemException)
++发送固定消息传递给用户,安抚用户。
发送特定消息给运维人员,提醒维护
记录日志++
其他异常(Exception)
++发送固定消息传递给用户,安抚用户
发送特定消息给编程人员,提醒维护(纳入预期范围内)
记录日志++
1.自定义项目系统级异常

2.自定义项目业务级异常

3.自定义异常编码

4.触发自定义异常(抛出)
5.拦截并处理异常

并在其中规范返回结果通知前端工作人员
