本节包括与 Spring Boot 应用程序直接相关的主题。Spring中文文档

创建您自己的 FailureAnalyzer

FailureAnalyzer 是在启动时截获异常并将其转换为人类可读的消息并封装在 FailureAnalysis 中的好方法。 Spring Boot 为与应用程序上下文相关的异常、JSR-303 验证等提供了这样的分析器。 您也可以创建自己的。Spring中文文档

AbstractFailureAnalyzer是一个方便的扩展,用于检查要处理的异常中是否存在指定的异常类型。 您可以从中扩展,以便您的实现仅在异常实际存在时才有机会处理异常。 如果出于某种原因无法处理异常,请返回以给另一个实现一个处理异常的机会。FailureAnalyzernullSpring中文文档

FailureAnalyzer实现必须在 中注册。 以下示例寄存器:META-INF/spring.factoriesProjectConstraintViolationFailureAnalyzerSpring中文文档

org.springframework.boot.diagnostics.FailureAnalyzer=\
com.example.ProjectConstraintViolationFailureAnalyzer
如果需要访问 或 ,请在实现中将它们声明为构造函数参数。BeanFactoryEnvironmentFailureAnalyzer
如果需要访问 或 ,请在实现中将它们声明为构造函数参数。BeanFactoryEnvironmentFailureAnalyzer

自动配置疑难解答

Spring Boot 自动配置会尽最大努力“做正确的事”,但有时事情会失败,而且很难说出原因。Spring中文文档

在任何Spring Boot中都有一个非常有用的可用。 如果启用日志记录输出,则可以看到它。 如果您使用(请参阅 Actuator 一章),则还有一个以 JSON 格式呈现报表的端点。 使用该终结点调试应用程序,并查看 Spring Boot 在运行时添加了哪些功能(以及尚未添加哪些功能)。ConditionEvaluationReportApplicationContextDEBUGspring-boot-actuatorconditionsSpring中文文档

通过查看源代码和 Javadoc,可以回答更多问题。 阅读代码时,请记住以下经验法则:Spring中文文档

  • 查找调用的类并读取其源代码。 请特别注意注释,以了解它们启用哪些功能以及何时启用。 添加到命令行或 System 属性,以在控制台上获取应用中做出的所有自动配置决策的日志。 在启用了执行器的正在运行的应用程序中,请查看端点(或 JMX 等效项)以获取相同的信息。*AutoConfiguration@Conditional*--debug-Ddebugconditions/actuator/conditionsSpring中文文档

  • 查找 (如 ServerProperties) 的类,并从那里读取可用的外部配置选项。 批注具有一个属性,该属性充当外部属性的前缀。 因此,has 及其配置属性是 、 等。 在启用了执行器的正在运行的应用程序中,查看端点。@ConfigurationProperties@ConfigurationPropertiesnameServerPropertiesprefix="server"server.portserver.addressconfigpropsSpring中文文档

  • 查找该方法的用途,以轻松的方式显式地从中提取配置值。 它通常与前缀一起使用。bindBinderEnvironmentSpring中文文档

  • 查找直接绑定到 的批注。@ValueEnvironmentSpring中文文档

  • 查找打开和关闭功能以响应 SpEL 表达式的注释,通常使用从 中解析的占位符进行计算。@ConditionalOnExpressionEnvironmentSpring中文文档

在启动之前自定义环境或 ApplicationContext

具有 和 用于将自定义项应用于上下文或环境。 Spring Boot 加载了许多此类自定义项,以便在内部使用 。 有多种方法可以注册其他自定义项:SpringApplicationApplicationListenersApplicationContextInitializersMETA-INF/spring.factoriesSpring中文文档

  • 以编程方式,按应用程序运行,方法是在运行之前调用 and 方法。addListenersaddInitializersSpringApplicationSpring中文文档

  • 以声明方式,对于所有应用程序,通过添加一个 jar 文件并打包一个应用程序都用作库的文件。META-INF/spring.factoriesSpring中文文档

向侦听器发送一些特殊消息(有些甚至在创建上下文之前),然后为侦听器注册 as 发布的事件。 有关完整列表,请参阅“Spring Boot 功能”部分中的“应用程序事件和侦听器”。SpringApplicationApplicationEventsApplicationContextSpring中文文档

还可以在刷新应用程序上下文之前使用 自定义 。 每个实现都应在 中注册,如以下示例所示:EnvironmentEnvironmentPostProcessorMETA-INF/spring.factoriesSpring中文文档

org.springframework.boot.env.EnvironmentPostProcessor=com.example.YourEnvironmentPostProcessor

该实现可以加载任意文件并将它们添加到 . 例如,以下示例从类路径加载 YAML 配置文件:EnvironmentSpring中文文档

import java.io.IOException;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.util.Assert;

public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {

	private final YamlPropertySourceLoader loader = new YamlPropertySourceLoader();

	@Override
	public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
		Resource path = new ClassPathResource("com/example/myapp/config.yml");
		PropertySource<?> propertySource = loadYaml(path);
		environment.getPropertySources().addLast(propertySource);
	}

	private PropertySource<?> loadYaml(Resource path) {
		Assert.isTrue(path.exists(), () -> "Resource " + path + " does not exist");
		try {
			return this.loader.load("custom-resource", path).get(0);
		}
		catch (IOException ex) {
			throw new IllegalStateException("Failed to load yaml configuration from " + path, ex);
		}
	}

}
import org.springframework.boot.SpringApplication
import org.springframework.boot.env.EnvironmentPostProcessor
import org.springframework.boot.env.YamlPropertySourceLoader
import org.springframework.core.env.ConfigurableEnvironment
import org.springframework.core.env.PropertySource
import org.springframework.core.io.ClassPathResource
import org.springframework.core.io.Resource
import org.springframework.util.Assert
import java.io.IOException

class MyEnvironmentPostProcessor : EnvironmentPostProcessor {

	private val loader = YamlPropertySourceLoader()

	override fun postProcessEnvironment(environment: ConfigurableEnvironment, application: SpringApplication) {
		val path: Resource = ClassPathResource("com/example/myapp/config.yml")
		val propertySource = loadYaml(path)
		environment.propertySources.addLast(propertySource)
	}

	private fun loadYaml(path: Resource): PropertySource<*> {
		Assert.isTrue(path.exists()) { "Resource $path does not exist" }
		return try {
			loader.load("custom-resource", path)[0]
		} catch (ex: IOException) {
			throw IllegalStateException("Failed to load yaml configuration from $path", ex)
		}
	}

}
已经准备好了 Spring Boot 默认加载的所有常用属性源。 因此,可以从环境中获取文件的位置。 前面的示例在列表末尾添加属性源,以便在任何通常的其他位置定义的键优先。 自定义实现可以定义另一个顺序。Environmentcustom-resource
虽然在 上使用似乎是加载自定义资源的便捷方式,但我们不建议这样做。 在刷新应用程序上下文之前,不会将此类属性源添加到 中。 配置某些属性(例如在刷新开始之前读取的属性)为时已晚。@PropertySource@SpringBootApplicationEnvironmentEnvironmentlogging.*spring.main.*
已经准备好了 Spring Boot 默认加载的所有常用属性源。 因此,可以从环境中获取文件的位置。 前面的示例在列表末尾添加属性源,以便在任何通常的其他位置定义的键优先。 自定义实现可以定义另一个顺序。Environmentcustom-resource
虽然在 上使用似乎是加载自定义资源的便捷方式,但我们不建议这样做。 在刷新应用程序上下文之前,不会将此类属性源添加到 中。 配置某些属性(例如在刷新开始之前读取的属性)为时已晚。@PropertySource@SpringBootApplicationEnvironmentEnvironmentlogging.*spring.main.*

生成 ApplicationContext 层次结构(添加父上下文或根上下文)

可以使用该类创建父/子层次结构。 有关详细信息,请参阅“Spring Boot 功能”部分中的“Fluent Builder API”ApplicationBuilderApplicationContextSpring中文文档

创建非 Web 应用程序

并非所有 Spring 应用程序都必须是 Web 应用程序(或 Web 服务)。 如果要在方法中执行某些代码,但又要引导 Spring 应用程序以设置要使用的基础结构,则可以使用 Spring Boot 的功能。 A 会更改其类,具体取决于它是否认为它需要 Web 应用程序。 为了帮助它,您可以做的第一件事是将与服务器相关的依赖项(例如 servlet API)从类路径中保留出来。 如果无法执行此操作(例如,如果从同一代码库运行两个应用程序),则可以显式调用实例或设置属性(通过 Java API 或使用外部属性)。 要作为业务逻辑运行的应用程序代码可以作为定义实现,也可以作为定义放入上下文中。mainSpringApplicationSpringApplicationApplicationContextsetWebApplicationType(WebApplicationType.NONE)SpringApplicationapplicationContextClassCommandLineRunner@BeanSpring中文文档