您现在的位置是:首页 > Javascript
当前栏目
在使用 Spring Boot 的过程中,你可能不太知道的点?
2023-04-18 14:12:06 时间
文章目录
如题,本文主要罗列一些在使用 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.properties
和application.yml
文件能够放在以下四个位置,优先级从高到低排序:- 外置,相对于应用程序运行目录的
/config
子目录里; - 外置,在应用程序运行的目录里;
- 内置,在
config
包内; - 内置,在
Classpath
根目录。
- 外置,相对于应用程序运行目录的
- 如果你在同一优先级的位置同时有
application.properties
和application.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 的
测试
- Spring 的
SpringJUnit4ClassRunner
可以在基于 JUnit 的应用程序测试里加载 Spring 应用程序上下文。 - 在大多数情况下,为 Spring Boot 应用程序编写测试时应该用
@SpringApplicationConfiguration
替代@ConntextConfiguration
注解。 - 要在测试里设置 Mock MVC,可以使用
MockMvcBuilders
,该类提供了两个静态方法:standaloneSetup()
和webAppContextSetup()
。两者的主要区别在于,standaloneSetup()
希望你手工初始化并注入你要测试的控制器,而webAppContextSetup()
则基于一个WebApplicationContext
的实例,通常由 Spring 加载。 - 在测试类上添加
@WebIntegrationTest
注解,可以声明你不仅希望 Spring Boot 为测试创建应用程序上下文,还要启动一个嵌入式的 Servlet 容器。 @WebIntegrationTest
的value
属性接受一个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 实战》这本书
相关文章
- C# 模拟Http请求
- Blazor数据绑定
- ApeForms | WinForm窗体UI美化库(Metro扁平风格)演示与安装
- p2p-tunnel 打洞内网穿透系列(五)socks5代理利用目标端访问web服务
- 【Jetpack】Lifecycle 架构组件 ( 系统组件与普通组件解耦 | Lifecycle 解耦系统组件与普通组件 | 解耦服务组件与普通组件 | 监听应用程序生命周期 )
- 【微信小程序】一文带你吃透开发中的常用组件
- Flutter WebView 如何与 h5 同步登录状态
- 二、小程序框架
- Flutter WebView 性能优化,让 h5 像原生页面一样优秀
- 【微信小程序】常用组件及基本使用详解
- 微信小程序抓包教程:Burpsuite版 附所需工具
- 前端项目中遇到的最大问题是什么,该如何回答
- uni-app框架看这五款组件库就够了
- 微信小程序 怎么插入图片?image组件的使用教程。
- 【Jetpack】Jetpack 简介 ( 官方架构设计标准 | Jetpack 组成套件 | Jetpack架构 | Jetpack 的存在意义 | AndroidX 与 Jetpack 的关系 )
- uniapp中全局页面挂载组件(小程序)
- mac 安装node.js
- uniapp 给自定义组件或uview等ui组件加class样式或修改样式在微信小程序不生效的情况
- uniapp开发小程序中将部分页面截取生成图片----最详细教程!!!
- Mac上安装node和npm