一、简介
springboot是spring提供的一个子项目,用于快速构建spring应用程序。
传统方式:
子项目都依赖于spring framework这个核心功能进行组合构建,比较麻烦。
1-1、传统spring的痛点
依赖难管理
-
引入依赖时,你得自己查清楚需要哪些 jar。
-
比如整合 Spring + MyBatis + Jackson,可能要引十几个 jar 包。
-
各 jar 包之间还有版本兼容问题。
配置太繁琐
-
Bean 要写
<bean>
标签,配置太多 XML。 -
Controller、Service、Dao 都要在配置文件中手动注册。
-
数据源、事务、AOP、MVC 配置全靠 XML 或 JavaConfig。
开发初期,写一堆配置文件才能跑一个小项目,非常低效!
启动麻烦
-
启动一个项目要配置 web.xml,配置 DispatcherServlet。
-
如果你用 Spring + Tomcat,还要单独部署 war 包。
无法快速创建项目
-
没有脚手架,没有自动化工具,每次都得从头配置。
1-2、springboot的特点
1-2-1、起步依赖
Spring Boot 的起步依赖(Starter Dependencies)——这是 Spring Boot 最具代表性的“爽点”之一。
1、什么是起步依赖(Starter Dependency)?
起步依赖(Starter)是 Spring Boot 提供的一组预定义的依赖集合,用来简化项目的依赖管理。
你只需要引入一个 starter,就相当于引入了一大堆相关的 jar,并且这些 jar 版本已经由 Spring Boot 帮你协调好了。
2、起步依赖的命名规则
Starter 的名字通常都是:
spring-boot-starter-xxx
起步依赖 | 功能 |
---|---|
spring-boot-starter | 核心起步依赖(包含日志、自动配置等) |
spring-boot-starter-web | 构建 Web 项目,包含 Spring MVC + Jackson + Tomcat |
spring-boot-starter-data-jpa | 操作数据库(JPA/Hibernate) |
spring-boot-starter-jdbc | 操作数据库(原生 JDBC) |
spring-boot-starter-security | Spring Security 安全框架 |
spring-boot-starter-test | 测试框架:JUnit、Mockito、AssertJ 等 |
spring-boot-starter-thymeleaf | 模板引擎 Thymeleaf |
spring-boot-starter-actuator | 提供运行时监控和指标(健康检查等) |
spring-boot-starter-validation | 表单和参数校验 |
3、示例:web 项目只需要 1 行依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
你就拥有了:
-
Spring MVC
-
Jackson JSON 解析
-
内嵌 Tomcat
-
其他常用工具类
-
自动配置能力
4、起步依赖的优点
优点 | 说明 |
---|---|
简化依赖 | 一个 starter 就包含多个常用依赖 |
避免冲突 | Spring Boot 使用 BOM(版本管理)统一控制依赖版本 |
自动配置 | 配合 Spring Boot 的自动装配机制,几乎零配置上手 |
快速上手 | 适合新手,也适合快速构建企业级应用 |
5、自定义 Starter(可选扩展)
在企业中,可以自定义 xxx-starter
,为多个项目统一封装依赖和配置,减少重复开发工作。
1-2-2、自动配置
我们以 Spring Boot + MyBatis 为例,来讲解 Spring Boot 的核心特性之一:自动配置(Auto Configuration)。
1、什么是 Spring Boot 的自动配置?
Spring Boot 会根据你引入的依赖和配置文件中的内容,自动帮你配置相关的 Bean、组件、环境,而你不需要自己去写复杂的配置类或 XML。
程序启动后,一些bean对象会自动注入到ioc容器中,不需要手动声明,简化开发。
2、Sprin + MyBatis 的传统配置(Spring时代)
在 Spring 中整合 MyBatis,你得做这些:
-
配置数据源(DataSource)
-
配置 SqlSessionFactory
-
配置 MapperScannerConfigurer 扫描 Mapper 接口
-
配置事务管理器
-
在 XML 里注册上述 Bean
繁琐又容易出错。
3、Spring Boot 如何自动帮你配置这些?
步骤一:加依赖
<!-- MyBatis 和 Spring Boot 整合起步依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version> <!-- 版本可查官网 -->
</dependency>
步骤二:写配置(application.yml 或 application.properties)
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.demo.pojo
步骤三:写 Mapper 接口
@Mapper
public interface CarMapper {
Car selectById(Long id);
}
步骤四:写 Service 调用就行了
4、Spring Boot 背后自动做了什么?
当你引入 mybatis-spring-boot-starter
后,Spring Boot 自动执行以下逻辑:
自动配置类:MybatisAutoConfiguration
Spring Boot 启动时,会扫描 spring.factories
里的配置项,其中包括:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
这个类会自动:
功能 | Spring Boot 自动做了什么 |
---|---|
数据源 | 根据 spring.datasource.* 配置自动创建 DataSource Bean |
SqlSessionFactory | 自动创建 SqlSessionFactory |
Mapper 接口 | 自动扫描 @Mapper 接口并注入到容器中 |
配置文件 | 自动加载 mybatis.mapper-locations 指定的 XML |
别名包 | 自动读取 type-aliases-package 并注册别名 |
你完全不用自己写这些配置类,Spring Boot 全部代劳!
5、要使用自动配置,还需要两点小细节
1. 扫描 Mapper(有两种方式)
// 方式一:每个 Mapper 接口加 @Mapper
@Mapper
public interface CarMapper {}
// 方式二:全局扫描 Mapper 包(推荐)
@MapperScan("com.example.demo.mapper")
@SpringBootApplication
public class DemoApplication {
...
}
2. Mapper XML 放在正确的位置
Spring Boot 默认扫描:
classpath:mapper/*.xml
你要么:
-
把 XML 放到
src/main/resources/mapper
目录 -
要么在配置文件中手动指定路径
1-2-3、springboot的其它特性
1. 内嵌的 Tomcat / Jetty(无需部署 WAR 文件)
(1)、传统 Spring(非 Boot)做法:
你得把整个项目打成 .war
包,然后:
-
安装 Tomcat
-
把
.war
放进webapps
目录 -
重启 Tomcat
-
看控制台看日志输出…
很麻烦!
(2)、Spring Boot 做法:
你只需要在项目中写一个 main()
方法:
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args); // 启动内嵌Tomcat
}
}
Spring Boot 内置了 Tomcat、Jetty 或 Undertow(默认是 Tomcat),打成的是 .jar
文件,运行只需一条命令:
java -jar myapp.jar
优势:
-
无需安装 Tomcat
-
可独立运行,部署更简单
-
容器化更方便(Docker + 微服务)
2. 外部化配置(Externalized Configuration)
你可以通过配置文件、命令行参数、环境变量等方式动态调整应用行为,而不改动 Java 代码!
举例:配置数据库连接
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo
username: root
password: 123456
你可以通过这些方式修改:
方式 | 示例 |
---|---|
配置文件 | application.properties 或 application.yml |
命令行参数 | --server.port=8081 |
环境变量 | SPRING_DATASOURCE_PASSWORD=abcdefg |
profile 文件 | application-dev.yml , application-prod.yml |
实际好处:
-
不同环境(开发 / 测试 / 生产)切换配置无痛
-
密码和端口可以通过命令行、环境变量注入,更安全
-
避免写死配置在代码里
3. 不需要 XML 配置(使用注解 + yml/properties)
传统 Spring:到处都是 XML
<bean id="carService" class="com.example.CarService"/>
<context:component-scan base-package="com.example"/>
看起来繁琐、容易错、读起来也吃力。
🚀 Spring Boot:用注解替代 XML
@Service
public class CarService {
...
}
再加个主类:
@SpringBootApplication // 相当于 @ComponentScan + @Configuration + @EnableAutoConfiguration
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
你不再需要写任何 Spring 配置 XML,几乎所有组件靠注解自动装配。
1-2-4、parent
对依赖做版本控制管理。
被parent管理的依赖,后期自己的项目加入<dependency>的时候,不需要加<version>。
依赖坐标的版本管理,完全取决于,你当前使用个的springboot中的parent版本!
【小结】:
- 开发 SpringBoot 程序要继承 spring-boot-starter-parent
- spring-boot-starter-parent 中定义了若干个依赖管理
- 继承 parent 模块可以避免多个依赖使用相同技术时出现依赖版本冲突
- 继承 parent 的形式也可以采用引入依赖的形式实现效果(使用阿里云创建springboot项目)
实际开发
- 使用任意坐标时,仅书写 GAV 中的 G 和 A,V 由 SpringBoot 提供,除非 SpringBoot 未提供对应版本 V
- 如发生坐标错误,再指定 Version(要小心版本冲突)
1-2-5、引导类
SpringBoot 的引导类是 Boot 工程的执行入口,运行 main 方法就可以启动项目;
SpringBoot 工程运行后初始化 Spring 容器,扫描引导类所在包加载 bean
1-2-6、内置tomcat服务器
内嵌tomcat工作原理,将tomcat服务器作为对象运行,并将该对象交给spring容器管理 。
1-3、创建一个hello springboot项目
点击apply,ok,spring new module将创建完成:
项目创建完成,打开pom.xml文件:
可以看到web起步依赖已添加,但是没有version这是因为:
所有的boot项目,都直接、间接的继承于父工程,主要用于起步依赖的版本。
你只要写下面这段代码,就能跑一个 Web 服务:
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}
不需要:
-
web.xml
-
DispatcherServlet 配置
-
Controller 扫描配置
只要加上 spring-boot-starter-web
,Spring Boot 就自动帮你搞定一切。
1-4、【回顾】:@RequestBody @RequestParam @PathVariable
1、区别
- @RequestParam用于接收url地址传参(http://xxxx/xxx?username=xxx)或表单传参
- @RequestBody用于接收json数据
- @PathVariable用于接收路径参数,使用{参数名称}描述路径参数
2、应用
- 后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
- 如果发送非json格式数据,选用@RequestParam接收请求参数
- 采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值