Spring boot 2.0 - 为用户配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring boot 2.0 - 为用户配置相关的知识,希望对你有一定的参考价值。

我有一个应用程序(springboot 2),客户希望编辑整数值,它表示AutoGrowCollectionLimit的最大值。默认情况下,此值(根据spring docs)设置为256,这对我们的目的来说还不够。

设置属性的代码:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setAutoGrowCollectionLimit([configurable_number]);
}

该值应该可以在配置文件中配置(例如some.txt),它将作为应用程序旁边的txt文件提供。现在放置some.txt文件无关紧要,即使是应用程序的root也可以。

这意味着,作为客户,我能够轻松改变它。打开some.txt文件并将值从:256改为:555。

在调查期间,我能够找到this。但它不适合我的情况。我正在寻找的是some.txt文件中的配置,具有非常简单的属性,即:

AutoGrowCollectionLimit = [configurable_number]

根据春天docs,我尝试了以下:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}

还编辑了[projectUrl] /src/main/resources/application.yml,其中包括:

set:
    max:
     collectionLimit: 500

当我尝试在以下位置调用此属性时,IDE正在期待')'或'}'

binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});

有人可以帮忙吗?

答案

在Spring Boot中有多种方法可以创建外部化配置,但是您需要使用@Value注入来实现几乎所有这些配置。

Value Injection

要注入配置值,需要使用@Value注释。这可以在你可以使用@Autowired的所有相同的地方完成。例如,在属性上:

@Value("${com.example.app.host-name}")
private String hostName;

或者通过构造函数或方法:

@Value("${com.example.app.host-name}")
public void setHostName(String hostName) { ... }

或者在特定的构造函数或方法参数上:

public MyServiceBean(
        @Value("${com.example.app.host-name}") String hostName,
        @Value("${com.example.app.port}") int port) {
    ...
}

您还可以使用:符号使用此系统提供默认值,例如:

@Value("${com.example.app.port:8180}")
public void setPort(int port) { ... }

所有这些中的${}位都使用Spring Expression Language进行解释。在这种情况下,${property}语法告诉Spring从上下文中检索property的值,这是通过查找上下文中所有PropertySource bean中的属性来完成的。您可以通过上下文使用Environment.getProperty自己完成此操作,例如:

ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);

使用@Value注释更方便,原因相同,使用@Autowired更方便

Spring Boot Configuration

由于您使用的是Spring Boot,因此您的应用程序中已经有一些PropertySource实例。例如,您的application.yml文件作为PropertySource加载。请注意,Spring会将名为a.b.c的属性转换为YAML文件中的嵌套文档。在你的情况下,这将是set.max.collectionLimit

Spring Boot通过查找application.ymlapplication.properties文件,以及System.getProperties()等其他属性来源,以及Spring Boot如何查找这些属性的默认顺序可以找到here in the documentation

External Configuration

要外部化您的配置,您声明您不想使用.yml文件,但是.properties呢?例如。:

set.max.collectionLimit=555

您可以将此文件放在.jar文件旁边,并将其命名为application.properties。此文件中的任何值都将覆盖内部application.yml文件中的值。

他们也可以override it directly on the command line,例如:

java -jar your-app.jar --set.max.collectionLimit=555

或通过System属性:

java -Dset.max.collectionLimit=555 -jar your-app.jar

所有这些都是覆盖值的有效方法,但仅当您使用值注入时,例如通过@Value

以上是关于Spring boot 2.0 - 为用户配置的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spring boot 2.0 配置 redis ttl

Spring Boot 2.0:Spring Boot 2.0尝鲜-动态 Banner

Spring boot2.0 与 2.0以前版本 跨域配置的区别

Nacos 2.0的Spring Boot Starter来了!

spring boot 2.0之使用spring boot

Spring Boot 2.0 教程 - 配置详解