|
对于最新稳定版本,请使用Spring Boot 4.0.0! |
Spring靴应用
本节包含与 Spring Boot 应用直接相关的主题。
创建您自己的失败分析器
故障排除 自动配置
Spring Boot 自动配置尽力“做正确的事”,但有时会出错,原因很难判断。
这里有非常实用的状况评估报告适用于任何春季靴应用上下文. 如果你开启,你可以看到调试日志输出。如果你使用Spring-启动-执行器(参见执行器部分),还有一个条件该端点以 JSON 格式渲染报告。利用该端点调试应用程序,并在运行时查看 Spring Boot 添加了哪些功能(哪些未添加)。
更多问题可以通过查看源代码和API文档来解答。阅读代码时,请记住以下经验法则:
-
找找
*自动配置并阅读他们的资料来源。特别注意@Conditional*注释以了解它们启用哪些功能以及何时启用。 加--调试命令行或系统属性-ddebug在控制台上记录你应用中所有自动配置决策的日志。在启用执行器的运行应用中,查看条件端点(/执行器/条件或JMX等价物)用于相同的信息。 -
找那些
@ConfigurationProperties(例如:ServerProperties然后读取可用的外部配置选项。 这@ConfigurationProperties注释具有名称作为外部属性的前缀的属性。 因此ServerProperties具有前缀=“服务器”其构型性质为server.port,server.address,以及其他。 在启用执行器的运行应用中,请查看配置道具端点。 -
查找
@ConditionalOnExpression根据SpEL表达式开关功能,通常用占位符从中解析的注释来评估特征。环境.
在开始之前先自定义环境或应用上下文
一个SpringApplication具有ApplicationListener和应用上下文初始化器用于将自定义应用到上下文或环境中的实现。
Spring Boot 为内部提供了多种此类自定义功能,从META-INF/spring.factories.
注册额外定制有多种方式:
-
在程序上,每个应用程序通过调用
addListeners和addInitializers方法SpringApplication在你运行之前。 -
声明式地,对于所有应用,通过添加一个
META-INF/spring.factories以及打包一个 jar 文件,所有应用程序都用作库。
这SpringApplication派来一些特别的应用事件对听者(有些甚至在上下文创建之前就已发送),然后为由应用上下文也。
完整列表请参见“春季新车功能”部分的应用事件和听众。
org.springframework.boot.env.EnvironmentPostProcessor=com.example.YourEnvironmentPostProcessor
实现可以加载任意文件并将其添加到环境.
例如,以下示例从类路径加载一个 YAML 配置文件:
-
Java
-
Kotlin
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 API。
创建一个非网页应用
并非所有Spring应用都必须是Web应用(或Web服务)。
如果你想在主要方法,但也可以启动一个Spring应用程序来搭建基础设施,你可以使用SpringApplicationSpring靴的特色。
一个SpringApplication其变更应用上下文类别,取决于它是否认为需要一个网页应用。
你能做的第一件事是把服务器相关的依赖(比如servlet API)从类路径中移除。
如果你做不到(比如你运行同一个代码库中的两个应用程序),那你可以显式调用setWebApplicationType(WebApplicationType.NONE)在你的SpringApplication实例或集合applicationContextClass属性(通过 Java API 或外部属性)。
你想作为业务逻辑运行的应用代码可以作为命令线跑者并被置于语境中,作为@Bean定义。