Spring Boot

第一个 Spring Boot 应用
目标是在浏览器访问指定地址时,由服务器返回 Hello World。
创建项目并引入依赖
可以通过 Spring Initializr 创建项目。以下示例使用 Spring Boot 3.3.4,因此运行环境至少需要 Java 17。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>编写控制器
@RestController
public class HelloController {
@GetMapping("/test")
public String test() {
return "Hello World";
}
}
启动项目后访问 http://localhost:8080/test,浏览器将显示 Hello World。
打包与部署
配置 Maven 插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
生成可执行 JAR
在项目根目录执行:
mvn clean package
构建成功后,可在 target 目录找到 JAR 文件。
运行项目
java -jar target/项目名称.jar
Spring Boot 的核心机制
父工程与依赖管理

spring-boot-starter-parent 提供常用 Maven 配置,并继承 Spring Boot 的依赖管理能力。

Spring Boot 会统一管理大量常用依赖的版本。引入已被管理的依赖时,通常不需要单独声明版本,从而降低版本冲突的概率。
Starter 场景启动器
spring-boot-starter-web 是 Web 场景启动器,会引入 Spring MVC、JSON 处理和默认嵌入式服务器等相关依赖。
如果需要把默认的 Tomcat 替换为 Jetty,可以排除 Tomcat 并引入 Jetty:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>启动类与 SpringApplication.run()
@SpringBootApplication
public class SpringBootDemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext =
SpringApplication.run(SpringBootDemoApplication.class, args);
System.out.println(applicationContext.getBean(HelloController.class));
}
}SpringApplication.run() 会启动 Spring 容器,执行自动配置,并在 Web 项目中启动嵌入式服务器。
@SpringBootApplication
@SpringBootApplication 是组合注解,主要包含以下能力:
@SpringBootConfiguration:表明当前类是 Spring Boot 配置类,本质上具有@Configuration的作用。@EnableAutoConfiguration:根据类路径中的依赖、已有 Bean 和配置属性进行自动配置。@ComponentScan:默认扫描启动类所在包及其子包。
因此,控制器、业务类、配置类等通常应放在启动类所在包或其子包中。若包结构不满足默认扫描范围,需要显式配置扫描路径。
自动配置
自动配置并不是无条件注册所有 Bean。Spring Boot 会结合依赖、配置属性和容器中已有 Bean 判断某项配置是否生效。
例如,引入 Web Starter 后,Spring Boot 会为 Spring MVC 应用配置 DispatcherServlet、请求映射、消息转换器等组件。开发者自己声明同类型 Bean 时,部分自动配置会按条件退让。
配置文件
Spring Boot 默认支持 application.properties 和 application.yml。YAML 通过缩进表示层级,缩进必须使用空格,不能使用制表符。

person:
last-name: tom
age: 20
married: false
birth: 1995-03-23
maps:
name1: jack
name2: rose
friends:
- zhangsan
- lisi
dog:
name: dog
age: 2使用 @ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean married;
private LocalDate birth;
private Map<String, String> maps;
private List<String> friends;
private Dog dog;
// getter 和 setter
}@ConfigurationProperties 适合批量绑定同一前缀下的配置。属性名支持宽松绑定,例如配置中的 last-name 可以绑定到 Java 属性 lastName。
对于配置类,也可以配合 @ConfigurationPropertiesScan 或 @EnableConfigurationProperties 注册,而不必在配置对象上添加 @Component。
@Value、@PropertySource 与 @ImportResource
@Value适合读取少量独立配置。@PropertySource可加载额外的.properties文件,但不直接支持 YAML。@ImportResource可导入传统 Spring XML 配置。
多环境配置
Spring Boot 使用 Profile 管理不同环境的配置。
多文件方式
application.yml
application-dev.yml
application-test.yml
application-prod.yml
在主配置中激活环境:
spring:
profiles:
active: dev
也可以通过启动参数覆盖:
java -jar app.jar --spring.profiles.active=prod
单文件多文档方式

YAML 可以使用 --- 分隔多个文档,并通过 spring.config.activate.on-profile 指定对应环境。
spring:
application:
name: demo
---
spring:
config:
activate:
on-profile: dev
server:
port: 8080
---
spring:
config:
activate:
on-profile: prod
server:
port: 80开发工具与热部署
引入 DevTools 后,类路径发生变化时可以触发应用重启。它属于开发辅助工具,不应作为生产环境部署方案。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
IDE 还需要开启自动编译或手动触发构建,否则修改后的类文件没有更新,DevTools 也不会重启应用。
Lombok 简化实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean married;
private LocalDate birth;
private Map<String, String> maps;
private List<String> friends;
private Dog dog;
}Lombok 会在编译阶段生成常用方法。使用时应安装 IDE 插件并开启注解处理,避免编辑器误报。
配置 Spring MVC 拦截器
编写拦截器
Spring Boot 3 使用 jakarta.servlet 包下的 Servlet API。
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler) {
System.out.println("preHandle");
return true;
}
@Override
public void postHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) {
System.out.println("postHandle");
}
}注册拦截器
推荐把拦截器本身注册为 Bean,再通过构造器注入到配置类中。
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
private final MyInterceptor myInterceptor;
public MyMvcConfig(MyInterceptor myInterceptor) {
this.myInterceptor = myInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login", "/error");
}
}@Component
public class MyInterceptor implements HandlerInterceptor {
// 拦截逻辑
}
整合 Druid 数据源
使用 Spring Boot 3 对应的 Druid Starter 时,不需要再重复引入普通 druid 依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.23</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://localhost:3306/java2601?serverTimezone=UTC&characterEncoding=utf8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
max-active: 10
min-idle: 3
initial-size: 2
max-wait: 10000测试数据源
@SpringBootTest
class SpringBootDemoApplicationTests {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
void testJdbcTemplate() {
List<Map<String, Object>> list =
jdbcTemplate.queryForList("SELECT * FROM t_user");
System.out.println(list);
System.out.println(jdbcTemplate.getDataSource());
}
}数据库账号和密码不应提交到公开仓库。实际项目可通过环境变量、外部配置文件或密钥管理服务提供敏感配置。
喜欢的话,留下你的评论吧~