SpringBoot2.6.2系列之开发-2

开发

本节更详细地介绍了如何使用 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

逐步取代自动配置

自动配置是非侵入性的。在任何时候,您都可以开始定义自己的配置来替换自动配置的特定部分。例如,如果您添加自己的DataSourcebean,则默认的嵌入式数据库支持会退出。

如果您需要了解当前正在应用哪些自动配置以及原因,请使用--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使用构造函数注入来获取所需RiskAssessorbean 的 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 可用于生产部署。由于它们是独立的,因此它们也非常适合基于云的部署。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕布辕门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值