Spring 引导 - Application.properties 中的自定义变量
Spring boot - custom variables in Application.properties
我有 spring 消耗 restful api 的引导客户端。不是在 java class 中硬编码 REST API 的 IP 地址,我可以使用 application.properties 中的任何密钥条目吗?
如果没有,我可以创建自定义条目吗?
谢谢
您可以将自己的条目添加到 application.properties。只需确保 属性 名称与 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties
中列出的通用属性不冲突
您可以使用
启动应用程序,而不是将 IP 硬编码到属性文件中
-Dmy.property=127.127.10.20
而Spring开机会自动选择
@Value("${my.property}")
private String myProperty;
Spring Boot 使用的基础结构可以完全相同的方式用在您自己的项目中。您在@zmitrok 的回答中评论了 "unknown property" 警告。那是因为您的 属性 没有元数据,所以 IDE 不知道。
我强烈建议您不要使用@Value
,因为与Spring Boot 提供的功能相比,它相当有限(@Value
是 Spring 框架功能)。
首先为您的 IP 创建一些 POJO:
@ConfigurationProperties("app.foo")
public class FooProperties {
/**
* IP of foo service used to blah.
*/
private String ip = 127.0.0.1;
// getter & setter
}
那么你有两个选择
- 将
@Component
放在 FooProperties
上,并通过在任何 @Configuration
class 上添加 @EnableConfigurationProperties
来启用配置属性的处理(最后一步是从 Spring 开始不再需要 Boot 1.3.0.M3
)
- 保持
FooProperties
不变,并将 @EnableConfigurationProperties(FooProperties.class)
添加到您的任何 @Configuration
class,这将自动为您创建一个 Spring Bean。
完成后,app.foo.ip
可以用在 application.properties
中,您可以 @Autowired
FooProperties
在代码中查找 属性
@Component
public MyRestClient {
private final FooProperties fooProperties;
@Autowired
public MyRestClient(FooProperties fooProperties) { ... }
public callFoo() {
String ip = this.fooProperties.getIp();
...
}
}
好的,您的 IDE 中的钥匙仍然是黄色的。最后一步是add an extra dependency that will look your code and generate the relevant meta-data at build time。将以下内容添加到您的 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
瞧,你的密钥被识别了,你有 javadoc 并且 IDE 给了你默认值(你在字段上初始化的值)。完成后,您可以使用转换服务处理的任何类型(即 URL
),并且该字段上的 javadoc 用于为您的密钥生成文档。
您还可以在您的字段上添加任何 JSR-303
约束验证(例如用于检查其是否为有效 IP 的正则表达式)。
查看 this sample project and the documentation 了解更多详情。
我有 spring 消耗 restful api 的引导客户端。不是在 java class 中硬编码 REST API 的 IP 地址,我可以使用 application.properties 中的任何密钥条目吗?
如果没有,我可以创建自定义条目吗?
谢谢
您可以将自己的条目添加到 application.properties。只需确保 属性 名称与 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties
中列出的通用属性不冲突您可以使用
启动应用程序,而不是将 IP 硬编码到属性文件中-Dmy.property=127.127.10.20
而Spring开机会自动选择
@Value("${my.property}")
private String myProperty;
Spring Boot 使用的基础结构可以完全相同的方式用在您自己的项目中。您在@zmitrok 的回答中评论了 "unknown property" 警告。那是因为您的 属性 没有元数据,所以 IDE 不知道。
我强烈建议您不要使用@Value
,因为与Spring Boot 提供的功能相比,它相当有限(@Value
是 Spring 框架功能)。
首先为您的 IP 创建一些 POJO:
@ConfigurationProperties("app.foo")
public class FooProperties {
/**
* IP of foo service used to blah.
*/
private String ip = 127.0.0.1;
// getter & setter
}
那么你有两个选择
- 将
@Component
放在FooProperties
上,并通过在任何@Configuration
class 上添加@EnableConfigurationProperties
来启用配置属性的处理(最后一步是从 Spring 开始不再需要 Boot1.3.0.M3
) - 保持
FooProperties
不变,并将@EnableConfigurationProperties(FooProperties.class)
添加到您的任何@Configuration
class,这将自动为您创建一个 Spring Bean。
完成后,app.foo.ip
可以用在 application.properties
中,您可以 @Autowired
FooProperties
在代码中查找 属性
@Component
public MyRestClient {
private final FooProperties fooProperties;
@Autowired
public MyRestClient(FooProperties fooProperties) { ... }
public callFoo() {
String ip = this.fooProperties.getIp();
...
}
}
好的,您的 IDE 中的钥匙仍然是黄色的。最后一步是add an extra dependency that will look your code and generate the relevant meta-data at build time。将以下内容添加到您的 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
瞧,你的密钥被识别了,你有 javadoc 并且 IDE 给了你默认值(你在字段上初始化的值)。完成后,您可以使用转换服务处理的任何类型(即 URL
),并且该字段上的 javadoc 用于为您的密钥生成文档。
您还可以在您的字段上添加任何 JSR-303
约束验证(例如用于检查其是否为有效 IP 的正则表达式)。
查看 this sample project and the documentation 了解更多详情。