目录
开发
本节更详细地介绍了如何使用 Spring Boot。它涵盖了诸如构建系统、自动配置以及如何运行应用程序等主题。我们还介绍了一些 Spring Boot 最佳实践。
构建系统
强烈建议您选择支持依赖管理并且可以使用发布到“Maven Central”存储库的工件的构建系统。我们建议您选择 Maven 或 Gradle。
依赖管理
Spring Boot 的每个版本都提供了它支持的依赖项的精选列表。实际上,您不需要在构建配置中为任何这些依赖项提供版本,因为 Spring Boot 会为您管理。当您升级 Spring Boot 本身时,这些依赖项也会以一致的方式升级。
starter
Starters 是一组方便的依赖描述符,您可以将其包含在您的应用程序中。您可以获得所需的所有 Spring 和相关技术的一站式商店,而无需搜索示例代码和复制粘贴加载的依赖描述符。例如,如果您想开始使用 Spring 和 JPA 进行数据库访问,请将spring-boot-starter-data-jpa
依赖项包含在您的项目中。
启动器包含许多依赖项,您需要这些依赖项使项目快速启动并运行,并具有一致的、受支持的托管传递依赖项集。
名称 | 描述 |
---|---|
spring-boot-starter-actuator | 使用 Spring Boot 的 Actuator 的 Starter,它提供了生产就绪的特性来帮助你监控和管理你的应用程序 |
构建你的代码
Spring Boot 不需要任何特定的代码布局即可工作。
使用“默认”包
当一个类不包含package
声明时,它被认为在“默认包”中。通常不鼓励使用“默认包”,应避免使用。它可能会导致使用@ComponentScan
、@ConfigurationPropertiesScan
、@EntityScan
或@SpringBootApplication
注释的 Spring Boot 应用程序出现特殊问题,因为每个 jar 中的每个类都被读取。
定位主应用程序类
我们通常建议您将主应用程序类定位在其他类之上的根包中。@SpringBootApplication
注释通常放置在您的主类上,它隐含地为某些项目定义了一个基本的“搜索包” 。例如,如果您正在编写 JPA 应用程序,则使用带@SpringBootApplication
注释的类的包来搜索@Entity
项目。使用根包还允许组件扫描仅应用于您的项目。
com
+- example
+- myapplication
+- MyApplication.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
该MyApplication.java
文件将声明main
方法以及 @SpringBootApplication
,如下所示:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
配置类
Spring Boot 支持基于 Java 的配置。尽管可以SpringApplication
与 XML 源一起使用,但我们通常建议您的主要源是单个@Configuration
类。通常,定义该main
方法的类是主要的候选者@Configuration
。
导入其他配置类
你不需要把你所有的东西都@Configuration
放在一个类里。注解可@Import
用于导入其他配置类。或者,您可以使用@ComponentScan
自动获取所有 Spring 组件,包括@Configuration
类。
导入 XML 配置
如果您绝对必须使用基于 XML 的配置,我们建议您仍然从@Configuration
类开始。然后,您可以使用@ImportResource
注释来加载 XML 配置文件。
自动配置
Spring Boot 自动配置尝试根据您添加的 jar 依赖项自动配置您的 Spring 应用程序。例如,如果HSQLDB
在你的类路径上,并且你没有手动配置任何数据库连接 bean,那么 Spring Boot 会自动配置一个内存数据库。
@EnableAutoConfiguration
您需要通过向其中一个类添加或@SpringBootApplication
注释来选择自动配置@Configuration
。
逐步取代自动配置
自动配置是非侵入性的。在任何时候,您都可以开始定义自己的配置来替换自动配置的特定部分。例如,如果您添加自己的DataSource
bean,则默认的嵌入式数据库支持会退出。
如果您需要了解当前正在应用哪些自动配置以及原因,请使用--debug
开关启动您的应用程序。这样做可以为选择的核心记录器启用调试日志,并将条件报告记录到控制台。
禁用特定的自动配置类
如果您发现正在应用您不想要的特定自动配置类,您可以使用 exclude 属性@SpringBootApplication
来禁用它们,如下例所示:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication {
}
如果类不在类路径上,您可以使用excludeName
注解的属性并指定完全限定名称。如果您更喜欢使用@EnableAutoConfiguration
而不是@SpringBootApplication
,exclude
并且excludeName
也可用。最后,您还可以使用该spring.autoconfigure.exclude
属性控制要排除的自动配置类的列表。
Spring Beans 和依赖注入
您可以自由使用任何标准 Spring Framework 技术来定义您的 bean 及其注入的依赖项。我们通常建议使用构造函数注入来连接依赖项并@ComponentScan
查找 bean。
如果您按照上面的建议构建代码(将应用程序类放在顶级包中),您可以添加@ComponentScan
不带任何参数或使用@SpringBootApplication
隐式包含它的注释。您的所有应用程序组件(@Component
、@Service
、@Repository
、@Controller
等)都会自动注册为 Spring Bean。
以下示例显示了一个@Service
使用构造函数注入来获取所需RiskAssessor
bean 的 Bean:
@Service
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
如果一个 bean 有多个构造函数,你需要标记你希望 Spring 使用的那个@Autowired
:
@Service
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
private final PrintStream out;
@Autowired
public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
this.out = System.out;
}
public MyAccountService(RiskAssessor riskAssessor, PrintStream out) {
this.riskAssessor = riskAssessor;
this.out = out;
}
// ...
}
请注意使用构造函数注入如何让该riskAssessor
字段标记为final
,表明它不能随后更改。
使用@SpringBootApplication
许多 Spring Boot 开发人员喜欢他们的应用程序使用自动配置、组件扫描并能够在他们的“应用程序类”上定义额外的配置。可以使用单个@SpringBootApplication
注释来启用这三个功能,即:
@EnableAutoConfiguration
: 启用Spring Boot 的自动配置机制@ComponentScan``@Component
:对应用程序所在的包启用扫描@SpringBootConfiguration
: 允许在上下文中注册额外的 bean 或导入额外的配置类。Spring 标准的替代方案@Configuration
。
@SpringBootApplication // same as @SpringBootConfiguration @EnableAutoConfiguration
// @ComponentScan
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
运行你的应用程序
将应用程序打包为 jar 并使用嵌入式 HTTP 服务器的最大优势之一是您可以像运行其他应用程序一样运行应用程序。
作为打包应用程序运行
如果您使用 Spring Boot Maven 或 Gradle 插件创建可执行 jar,则可以使用 运行您的应用程序java -jar
,如以下示例所示:
$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
热插拔
由于 Spring Boot 应用程序是普通的 Java 应用程序,因此 JVM 热交换应该开箱即用。
spring-boot-devtools
模块还包括对快速应用程序重启的支持。
开发者工具
Spring Boot 包含一组额外的工具,可以使应用程序开发体验更加愉快。该spring-boot-devtools
模块可以包含在任何项目中,以提供额外的开发时功能。要包含 devtools 支持,请将模块依赖项添加到您的构建中,如下面的 Maven 和 Gradle 清单所示:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
运行完全打包的应用程序时,开发人员工具会自动禁用。如果你的应用程序是从一个特殊的类加载器启动的,java -jar
或者它是从一个特殊的类加载器启动的,那么它被认为是一个“生产应用程序”。您可以使用spring.devtools.restart.enabled
系统属性来控制此行为。要启用 devtools,无论用于启动应用程序的类加载器如何,设置-Dspring.devtools.restart.enabled=true
系统属性。这不能在运行 devtools 存在安全风险的生产环境中完成。要禁用 devtools,请排除依赖项或设置-Dspring.devtools.restart.enabled=false
系统属性。
属性默认值
Spring Boot 支持的几个库使用缓存来提高性能。
虽然缓存在生产中非常有用,但在开发过程中可能会适得其反,使您无法看到刚刚在应用程序中所做的更改。因此,spring-boot-devtools 默认禁用缓存选项。
自动重启
spring-boot-devtools
每当类路径上的文件更改时,使用自动重新启动的应用程序。在 IDE 中工作时,这可能是一个有用的功能,因为它为代码更改提供了一个非常快速的反馈循环。默认情况下,类路径上指向目录的任何条目都会被监视更改。请注意,某些资源,例如静态资产和视图模板,不需要重新启动应用程序。
排除资源
某些资源在更改时不一定需要触发重新启动。
spring:
devtools:
restart:
exclude: "static/**,public/**"
禁用重启
如果您不想使用重启功能,可以使用该spring.devtools.restart.enabled
属性禁用它。在大多数情况下,您可以在您的中设置此属性application.properties
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApplication.class, args);
}
}
实时重载
该spring-boot-devtools
模块包括一个嵌入式 LiveReload 服务器,可用于在资源更改时触发浏览器刷新。
如果您不想在应用程序运行时启动 LiveReload 服务器,您可以将该spring.devtools.livereload.enabled
属性设置为false
全局设置
您可以通过将以下任何文件添加到$HOME/.config/spring-boot
目录来配置全局 devtools 设置:
spring:
devtools:
restart:
trigger-file: ".reloadtrigger"
配置文件系统观察程序
特定时间间隔轮询类更改,然后等待预定义的静默期以确保没有更多更改。
spring:
devtools:
restart:
poll-interval: "2s"
quiet-period: "1s"
现在每 2 秒轮询一次受监视的类路径目录以进行更改,并保持 1 秒的静默期以确保没有额外的类更改。
远程应用程序
Spring Boot 开发者工具不仅限于本地开发。您还可以在远程运行应用程序时使用多种功能。远程支持是可选的,因为启用它可能会带来安全风险。只有在受信任的网络上运行或使用 SSL 保护时才应启用它。如果您无法使用这些选项,则不应使用 DevTools 的远程支持。您永远不应该在生产部署中启用支持。
要启用它,您需要确保它devtools
包含在重新打包的存档中,如以下清单所示:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludeDevtools>false</excludeDevtools>
</configuration>
</plugin>
</plugins>
</build>
然后你需要设置spring.devtools.remote.secret
属性。与任何重要的密码或秘密一样,该值应该是唯一且强大的,以至于无法猜测或暴力破解。
打包您的生产应用程序
可执行 jar 可用于生产部署。由于它们是独立的,因此它们也非常适合基于云的部署。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY