
前言:尽管我们以后要学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 (数据库连接池配置)作用:替代 web.xml,启动容器,加载 Spring 和 SpringMVC 配置
继承:AbstractAnnotationConfigDispatcherServletInitializer
作用: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
}作用: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();
}
}作用:配置数据源(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作用:配置 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 | 请求处 |
客户端请求
↓
Controller层 (接收请求)
↓
Service层 (业务处理) ← 抛出异常
↓ ↓
↓ 异常向上传播
↓ ↓
Controller层 (没有try-catch)
↓ ↓
↓ 异常继续传播
↓ ↓
全局异常处理器 ← ← ← ← ← 捕获异常
↓
统一处理后返回给客户端出现异常现象的常见位置与常见诱因如下:
框架内部抛出的异常:因使用不合规导致 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时) 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)
表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)
工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)
业务异常(BusinessException) 发送对应消息传递给用户,提醒规范操作
系统异常(SystemException) 发送固定消息传递给用户,安抚用户。 发送特定消息给运维人员,提醒维护 记录日志
其他异常(Exception) 发送固定消息传递给用户,安抚用户 发送特定消息给编程人员,提醒维护(纳入预期范围内) 记录日志





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