在使用 Spring Boot 的过程中,你可能不太知道的点?

文章目录

    • 基础
    • 配置
    • 测试
    • 监控

如题,本文主要罗列一些在使用 Spring Boot 的过程中,大家可能不太知道的点。

基础

  • Spring Boot 的精髓,主要包括自动配置、起步依赖、Actuator 和命令行界面。
  • Spring Initializr,Click HERE,一个 Spring Boot 的快速搭建网站。
  • @SpringBootApplication注解开启了 Spring 组件扫描和 Spring Boot 的主动配置功能。
  • org.springframework.boot:spring-boot-maven-plugin构建插件的主要功能是把项目打包成一个可执行的超级 JAR,包括把应用程序的所有依赖打入 JAR 文件内,并为 JAR 添加一个描述文件,其中的内容能让你用java -jar命令来运行应用程序。
  • spring-boot-starter-parent作为上一级依赖,就能够利用 Maven 的依赖管理功能,继承很多常用库的依赖版本,在你声明依赖时就不用再去指定版本号了。
  • 起步依赖本质上是一个 Maven 项目对象模型(Project Object Model,POM),定义了对其它库的传递依赖,这些东西加在一起即支持某项功能。起步依赖本身的版本由正在使用的 Spring Boot 的版本来决定,而起步依赖则会决定它们引入的传递依赖的版本。
  • Maven 总是会用最近的依赖,也就是说,你在项目的构建说明文件里增加的依赖,即显示引入的依赖及版本,会覆盖传递依赖引入的另一个依赖。

配置

  • 在向应用程序加入 Spring Boot 时,有一个名为spring-boot-autoconfigure的 JAR 文件,其中包含了很多配置类。而这些配置类上,都加了@Conditional注解,即条件注解,引入条件化配置。
  • 条件化配置允许配置存在于应用程序中,但在满足某些特定条件之前都忽略这个配置。Spring Boot 的自动注入功能,就是利用条件化配置实现的。
  • 想要覆盖 Spring Boot 的自动配置,你所要做的仅仅是编写一个显示的配置。Spring Boot 会发现你的配置,随后降低字段配置的优先级,以你的配置为准。Spring Boot 的设计就是优先加载应用级配置,随后再考虑自动配置类。
  • Spring Boot 能从多种属性源获得属性,以下属性源按优先级从高到低排序,任何在高优先级属性源里设置的属性都会覆盖低优先级的相同属性,包括:
    • 命令行参数;
    • java:comp/env里的 JNDI 属性;
    • JVM 系统属性;
    • 操作系统环境变量;
    • 随机生成的带random.*前缀的属性(在设置其他属性时,可以引用它们,比如${random.long});
    • 应用程序以外的application.properties或者application.yml文件;
    • 打包在应用程序内的application.properties或者application.yml文件;
    • 通过@PropertySource标注的属性源;
    • 默认属性。
  • application.propertiesapplication.yml文件能够放在以下四个位置,优先级从高到低排序:
    • 外置,相对于应用程序运行目录的/config子目录里;
    • 外置,在应用程序运行的目录里;
    • 内置,在config包内;
    • 内置,在Classpath根目录。
  • 如果你在同一优先级的位置同时有application.propertiesapplication.yml文件时,那么application.yml里的属性会覆盖application.properties里的属性。
  • 默认情况下,Spring Boot 会用 Logback 来记录日志,并用INFO级别输出到控制台。如果你想要切换日志实现,如Log4j或者Log4j2,那么你只需要修改依赖,引入对应该实现的起步依赖,同时排除掉Logback即可。
  • DataSource Bean 是一个连接池,如果Classpath里有 Tomcat 的连接池DataSource,那么就会使用这个连接池;否则,Spring Boot 会在Classpath里查找以下连接池:
    • HikariCP
    • Commons DBCP
    • Commons DBCP 2
  • 对于@ConfigurationProperties注解,从技术上来讲,仅使用它是不会生效的,除非先向 Spring 配置类添加@EnableConfigurationProperties注解。但通常无需这么做,因为 Spring Boot 自动配置后面的全部配置类都已经添加了@EnableConfigurationProperties注解。因此,除非你完全不用自动配置(那怎么可能?),否则就无需显式地添加@EnableConfigurationProperties注解。
  • Spring Boot 的属性解析器非常智能,它会自动把驼峰规则的属性和使用连字符或下划线的同名属性关联起来。换句话说,i.loveU这个属性和i.love_u以及i.love-u都是等价的。
  • Spring Boot 自动配置的默认错误处理器会查找名为error的视图,如果找不到就用默认的白标错误视图。如果我们使用了不同的视图解析器,则命名略有差别,如:
    • 实现了 Spring 的View接口的 Bean,其 ID 为error,由 Spring 的BeanNameViewResolver所解析;
    • 如果配置了 Thymeleaf,则有名为error.html的 Thymeleaf 模板;
    • 如果配置了 FreeMarker,则有名为error.ftl的 FreeMarker模板;
    • 如果配置了 Velocity,则有名为error.vm的 Velocity模板;
    • 如果是用 JSP 视图,则有名为error.jsp的 JSP 模板。

测试

  • Spring 的SpringJUnit4ClassRunner可以在基于 JUnit 的应用程序测试里加载 Spring 应用程序上下文。
  • 在大多数情况下,为 Spring Boot 应用程序编写测试时应该用@SpringApplicationConfiguration替代@ConntextConfiguration注解。
  • 要在测试里设置 Mock MVC,可以使用MockMvcBuilders,该类提供了两个静态方法:standaloneSetup()webAppContextSetup()。两者的主要区别在于,standaloneSetup()希望你手工初始化并注入你要测试的控制器,而webAppContextSetup()则基于一个WebApplicationContext的实例,通常由 Spring 加载。
  • 在测试类上添加@WebIntegrationTest注解,可以声明你不仅希望 Spring Boot 为测试创建应用程序上下文,还要启动一个嵌入式的 Servlet 容器。
  • @WebIntegrationTestvalue属性接受一个String数组,数组中的每项都是键值对,形如name=value,用来设置测试中使用的属性。@WebIntegrationTest还提供了一个randomPort属性,其值为布尔型,表示让服务器在随机端口上启动。
  • server.port属性设置为 0,也可以让 Spring Boot 选择一个随机的可用端口。

监控

  • 引入org.springframework.boot:spring-boot-starter-actuator依赖,可以启用 Spring Boot 的 Actuator 端点,用于监控项目的运行情况。
  • 通过/beans端点,可以获取上下文里每个 Bean 的情况,包括其 Java 类型以及注入的其他 Bean。
  • 通过/metrics端点,可以获取应用程序的度量信息,比如内存使用量和 HTTP 请求计数等。
  • 通过/trace端点,可以获取应用程序所有 Web 请求的详细信息,包括请求方法、路径、时间戳以及请求和响应的头信息。
  • 通过/dump端点,可以生成当前线程活动的快照。
  • 通过/shutdown端点,可以关闭当前运行的程序,默认为未启用状态,可以通过endpoints.shutdown.enabled=true属性开启。
  • 引入org.springframework.boot:spring-boot-starter-remote-shell依赖,可以启用 Spring Boot 集成的 CRaSH,是一种能嵌入任意 Java 应用程序的 shell 脚本。开启 shell 功能后,其用户名是user,密码本身是随机生成的,每次运行应用程序时都会有所变化,会将其写入到日志中,监听2000端口号。
  • Actuator 有多种定制方式,包括重命名端点、启用和禁用端点、自定义度量信息、创建自定义仓库来存储跟踪信息和插入自定义的监控指示器。
  • 通过实现PublicMetrics接口,可以提供自己需要的度量信息。该接口定义了一个metrics方法,返回一个Metric对象的集合。
  • 默认情况下,/trace端点报告的跟踪信息都存储在内存仓库里,100 个条目封顶。一旦仓库满了,就开始移除条目,给新的条目腾出空间。为了避免这个问题,我们可以声明自己的InMemoryTraceRepository Bean,将它的容量调制 100 以上。
  • 自定义的监控指示器,需要实现HealthIndicator接口,并实现其health()方法。
  • 可以通过management.context-path属性设置端点的上下文路径。默认情况下,这个属性是空的,所以 Actuator 的端点路径都是相对于根路径的。

版权声明:本文的内容主要来自于《Spring Boot 实战》这本书,感兴趣的同学可以自行购买,阅读。

你可能感兴趣的:(工具及其它)