1.1. 创建自己的FailureAnalyzer
FailureAnalyzer
是在启动时拦截异常并将其转换为人类可读消息的好方法,并包装在内FailureAnalysis
。Spring Boot为与应用程序上下文相关的异常,JSR-303验证等提供了此类分析器。您也可以创建自己的。AbstractFailureAnalyzer
是一个方便的扩展,FailureAnalyzer
它检查要处理的异常中是否存在指定的异常类型。您可以对此进行扩展,以便您的实现只有在实际出现异常时才有机会处理该异常。如果由于某种原因您无法处理该异常,请返回null
以使另一个实现有机会处理该异常。FailureAnalyzer
实施必须在中注册META-INF/spring.factories
。以下示例注册ProjectConstraintViolationFailureAnalyzer
:
org.springframework.boot.diagnostics.FailureAnalyzer=\
com.example.ProjectConstraintViolationFailureAnalyzer
如果您需要访问BeanFactory 或Environment ,则FailureAnalyzer 可以分别实现BeanFactoryAware 或EnvironmentAware 。 |
|
---|---|
1.2. 自动配置故障排除
Spring Boot自动配置会尽力“做正确的事”,但有时会失败,并且很难说出原因。ConditionEvaluationReport
任何Spring Boot中都有一个非常有用的功能ApplicationContext
。如果启用DEBUG
日志记录输出,则可以看到它。如果使用spring-boot-actuator
(请参阅“执行器”一章),则还有一个conditions
终结点,该终结点以JSON形式呈现报告。使用该端点来调试应用程序,并在运行时查看Spring Boot已添加(未添加)哪些功能。
通过查看源代码和Javadoc,可以回答更多问题。阅读代码时,请记住以下经验法则:
- 查找称为的类
*AutoConfiguration
并阅读其源代码。特别注意@Conditional*
注释,以了解它们启用了哪些功能以及何时启用。添加--debug
到命令行或“系统”属性-Ddebug
以在控制台上获取应用程序中做出的所有自动配置决策的日志。在启用了执行器的运行应用程序中,查看conditions
端点(/actuator/conditions
或等效的JMX)以获取相同信息。 - 查找属于
@ConfigurationProperties
(例如ServerProperties
)的类,然后从中读取可用的外部配置选项。该@ConfigurationProperties
注释具有一个name
充当前缀外部性能属性。因此,ServerProperties
拥有prefix="server"
和它的配置性能server.port
,server.address
以及其他。在启用了执行器的运行应用程序中,查看configprops
端点。 - 寻找对
bind
方法的使用,以一种轻松的方式Binder
将配置值明确地拉出Environment
。它通常与前缀一起使用。 - 查找
@Value
直接绑定到的注释Environment
。 寻找可
@ConditionalOnExpression
根据SpEL表达式打开和关闭功能的注释,这些注释通常使用从中解析的占位符进行评估Environment
。1.3. 在启动环境或ApplicationContext之前对其进行自定义
一个
SpringApplication
具有ApplicationListeners
与ApplicationContextInitializers
被用于应用自定义的背景或环境。Spring Boot加载了许多此类自定义项,以供内部使用META-INF/spring.factories
。注册其他自定义项的方法有多种:在运行之前,通过对每个应用程序进行编程,方法是调用
addListeners
和addInitializers
方法SpringApplication
。- 通过设置
context.initializer.classes
或context.listener.classes
属性,以声明方式针对每个应用程序。 - 声明性地,对于所有应用程序,通过添加
META-INF/spring.factories
和打包一个jar文件,这些文件都被应用程序用作库。
该SpringApplication
发送一些特殊ApplicationEvents
的听众(背景下创造了一些甚至更早),然后注册了在公布的事件监听器ApplicationContext
为好。有关完整列表,请参见“ Spring Boot功能”部分中的“应用程序事件和侦听器”。
还可以使用来自定义Environment
刷新应用程序上下文之前的EnvironmentPostProcessor
。每个实现都应在中注册META-INF/spring.factories
,如以下示例所示:
org.springframework.boot.env.EnvironmentPostProcessor = com.example.YourEnvironmentPostProcessor
该实现可以加载任意文件并将其添加到中Environment
。例如,以下示例从类路径加载YAML配置文件:
public class EnvironmentPostProcessorExample 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) {
if (!path.exists()) {
throw new IllegalArgumentException("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);
}
}
}
在Environment 已经准备与所有常见的财产来源春天引导加载默认。因此可以从环境中获取文件的位置。前面的示例将custom-resource 属性源添加到列表的末尾,以便在其他任何常见位置定义的键具有优先权。定制实现可以定义另一个顺序。 |
|
---|---|
在使用@PropertySource 你的@SpringBootApplication 似乎是加载在一个自定义资源的便利方式Environment ,我们不建议这样做。Environment 在刷新应用程序上下文之前,不会将此类属性源添加到中。现在配置某些属性(如logging.* 和spring.main.* 在刷新开始之前先读取)为时已晚。 |
|
---|---|
1.4. 建立ApplicationContext层次结构(添加父上下文或根上下文)
您可以使用ApplicationBuilder
该类创建父/子ApplicationContext
层次结构。有关更多信息,请参见“ Spring Boot功能”部分中的“ spring-boot-features.html ”。
1.5. 创建一个非Web应用程序
并非所有的Spring应用程序都必须是Web应用程序(或Web服务)。如果要在main
方法中执行一些代码,又要引导Spring应用程序以设置要使用的基础结构,则可以使用SpringApplication
Spring Boot的功能。A根据是否认为需要Web应用程序来SpringApplication
更改其ApplicationContext
类。您可以做的第一件事是让服务器相关的依赖项(例如Servlet API)脱离类路径。如果你不能做到这一点(例如,您从相同的代码库的两个应用程序),那么你可以显式调用setWebApplicationType(WebApplicationType.NONE)
您的SpringApplication
实例或设置applicationContextClass
属性(通过Java API或与外部属性)。您可以将要作为业务逻辑运行的应用程序代码实现为CommandLineRunner
并作为@Bean
定义放到上下文中。