对于最新稳定版本,请使用Spring Boot 4.0.0spring-doc.cadn.net.cn

Spring靴应用

本节包含与 Spring Boot 应用直接相关的主题。spring-doc.cadn.net.cn

创建您自己的失败分析器

故障分析器是启动时拦截异常并转化为人类可读消息、包裹在失效分析. Spring Boot 提供了用于应用上下文相关异常、JSR-303 验证等的分析器。你也可以自己创建分析器。spring-doc.cadn.net.cn

摘要故障分析器是 的方便扩展故障分析器它检查要处理的异常中是否存在指定异常类型。你可以从该异常基础扩展,使实现只有在异常实际存在时才有机会处理该异常。如果因某种原因无法处理异常,返回以便给另一个实现处理异常的机会。spring-doc.cadn.net.cn

故障分析器实现必须注册于META-INF/spring.factories. 以下示例寄存器项目约束违规失败分析器:spring-doc.cadn.net.cn

org.springframework.boot.diagnostics.FailureAnalyzer=\
com.example.ProjectConstraintViolationFailureAnalyzer
如果你需要访问豆子工厂或者环境,将它们声明为构造子参数,在你的故障分析器实现。

故障排除 自动配置

Spring Boot 自动配置尽力“做正确的事”,但有时会出错,原因很难判断。spring-doc.cadn.net.cn

这里有非常实用的状况评估报告适用于任何春季靴应用上下文. 如果你开启,你可以看到调试日志输出。如果你使用Spring-启动-执行器(参见执行器部分),还有一个条件该端点以 JSON 格式渲染报告。利用该端点调试应用程序,并在运行时查看 Spring Boot 添加了哪些功能(哪些未添加)。spring-doc.cadn.net.cn

更多问题可以通过查看源代码和API文档来解答。阅读代码时,请记住以下经验法则:spring-doc.cadn.net.cn

在开始之前先自定义环境或应用上下文

一个SpringApplication具有ApplicationListener应用上下文初始化器用于将自定义应用到上下文或环境中的实现。 Spring Boot 为内部提供了多种此类自定义功能,从META-INF/spring.factories. 注册额外定制有多种方式:spring-doc.cadn.net.cn

  • 在程序上,每个应用程序通过调用addListenersaddInitializers方法SpringApplication在你运行之前。spring-doc.cadn.net.cn

  • 声明式地,对于所有应用,通过添加一个META-INF/spring.factories以及打包一个 jar 文件,所有应用程序都用作库。spring-doc.cadn.net.cn

SpringApplication派来一些特别的应用事件对听者(有些甚至在上下文创建之前就已发送),然后为由应用上下文也。 完整列表请参见“春季新车功能”部分的应用事件和听众spring-doc.cadn.net.cn

也可以自定义环境在应用上下文刷新之前,通过以下方式环境后处理器. 每个实现都应注册于META-INF/spring.factories如下例所示:spring-doc.cadn.net.cn

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

实现可以加载任意文件并将其添加到环境. 例如,以下示例从类路径加载一个 YAML 配置文件:spring-doc.cadn.net.cn

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 默认加载的所有常见属性源。 因此,可以从环境中获取文件的位置。 前例补充了自定义资源在列表末尾设置属性源,使得在通常其他位置定义的键优先。 自定义实现可能会定义另一种顺序。
使用@PropertySource在你的@SpringBootApplication看似是加载自定义资源的方便方式环境我们不推荐。 此类属性源不会被添加到环境直到应用上下文被刷新。 现在配置某些属性已太晚,比如Logging。*spring.main.*这些数据在刷新开始前阅读。

构建 ApplicationContext 层级结构(添加父上下文或根上下文)

你可以使用SpringApplicationBuilder创建父/子的类应用上下文层次 结构。 更多信息请参见“Spring Boot 功能”部分中的 Fluent Builder APIspring-doc.cadn.net.cn

创建一个非网页应用

并非所有Spring应用都必须是Web应用(或Web服务)。 如果你想在主要方法,但也可以启动一个Spring应用程序来搭建基础设施,你可以使用SpringApplicationSpring靴的特色。 一个SpringApplication其变更应用上下文类别,取决于它是否认为需要一个网页应用。 你能做的第一件事是把服务器相关的依赖(比如servlet API)从类路径中移除。 如果你做不到(比如你运行同一个代码库中的两个应用程序),那你可以显式调用setWebApplicationType(WebApplicationType.NONE)在你的SpringApplication实例或集合applicationContextClass属性(通过 Java API 或外部属性)。 你想作为业务逻辑运行的应用代码可以作为命令线跑者并被置于语境中,作为@Bean定义。spring-doc.cadn.net.cn