Spring boot 2.0 – 用户配置
Spring boot 2.0 - configuration for users
我有一个应用程序(springboot 2),客户想要编辑整数值,它代表 AutoGrowCollectionLimit 的最大值。这个值默认(根据 spring 文档)设置为 256,这对于我们的目的来说是不够的。
设置属性的代码:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit([configurable_number]);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}
set:
max:
collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@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) { ... }
ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar
这个值应该可以在配置文件中进行配置(比如说 some.txt),它将作为一个 txt 文件在应用程序旁边提供。现在将 some.txt 文件放在哪里都没有关系,现在即使是应用程序的 root 也可以。
这意味着,作为客户,我可以轻松更改它。打开 some.txt 文件并将值从 i.e.: 256 更改为 i.e.: 555.
在调查过程中,我发现了这一点。但它不适合我的情况。我正在寻找的是 some.txt 文件中具有非常简单属性的配置,即:
AutoGrowCollectionLimit=[configurable_number]
根据 spring 文档,我尝试了以下操作:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit([configurable_number]);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}
set:
max:
collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@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) { ... }
ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar
还编辑了 [projectUrl]/src/main/resources/application.yml 如下:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit([configurable_number]);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}
set:
max:
collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@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) { ... }
ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar
IDE 期待 \\')\\' 或 \\'}\\',当我试图在以下位置调用此属性时:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit([configurable_number]);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}
set:
max:
collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@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) { ... }
ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar
有人可以帮忙吗?
在 Spring Boot 中有多种方法可以创建外部化配置,但是您需要使用 @Value 注入来实现几乎所有这些。
价值注入
要注入配置值,您需要使用 @Value 注释。这可以在您可以使用 @Autowired 的所有相同位置完成。例如,在一个属性上:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit([configurable_number]);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}
set:
max:
collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@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) { ... }
ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar
或者通过构造函数或方法:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit([configurable_number]);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}
set:
max:
collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@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) { ... }
ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar
或在特定的构造函数或方法参数上:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit([configurable_number]);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}
set:
max:
collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@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) { ... }
ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar
您还可以使用此系统使用 : 符号提供默认值,例如:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit([configurable_number]);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}
set:
max:
collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@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) { ... }
ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar
所有这些中的 ${} 位都是使用 Spring 表达式语言解释的。在这种情况下,${property} 语法告诉 Spring 从上下文中检索 property 的值,这是通过在上下文中查找所有 PropertySource bean 中的属性来完成的。您也可以通过上下文使用 Environment.getProperty 自己执行此操作,例如:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit([configurable_number]);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}
set:
max:
collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@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) { ... }
ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar
使用 @Value 注释更方便,原因与使用 @Autowired
更方便的原因相同
Spring引导配置
由于您使用的是 Spring Boot,因此您的应用程序中已经有一些 PropertySource 实例。例如,您的 application.yml 文件作为 PropertySource 加载。请注意,Spring 会将名为 a.b.c 的属性转换为 YAML 文件中的嵌套文档。在您的情况下,这将是 set.max.collectionLimit.
Spring Boot 通过查找 application.yml 和 application.properties 文件以及其他属性来源(如 System.getProperties())来执行此操作,并且可以在文档中找到 Spring Boot 如何查找这些属性的默认顺序.
外部配置
为了使您的配置外部化,您声明您不想使用 .yml 文件,但是 .properties 呢?例如:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit([configurable_number]);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}
set:
max:
collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@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) { ... }
ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar
您可以将此文件放在 .jar 文件旁边,并将其命名为 application.properties。此文件中的任何值都将覆盖您在内部 application.yml 文件中的值。
他们也可以直接在命令行上覆盖它,例如:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit([configurable_number]);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}
set:
max:
collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@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) { ... }
ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar
或通过 System 属性:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit([configurable_number]);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
}
set:
max:
collectionLimit: 500
binder.setAutoGrowCollectionLimit(${set.max.collectionLimit});
@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) { ... }
ApplicationContext appCtx = ... ;
int port = appCtx.getEnvironment().getProperty("com.example.app.port", Integer.class);
set.max.collectionLimit=555
java -jar your-app.jar --set.max.collectionLimit=555
java -Dset.max.collectionLimit=555 -jar your-app.jar
所有这些都是覆盖值的有效方法,但前提是您使用值注入,例如通过 @Value.