稍微粘贴一下配置文件信息,但还是没有总结出最佳实践,todo待总结,不过想必是spring源码的配置方式吧。
判断环境是否是web环境
SpringApplication
将尝试为你创建正确类型的ApplicationContext
,默认情况下,根据你开发的是否为web应用决定使用AnnotationConfigApplicationContext
或AnnotationConfigEmbeddedWebApplicationContext
。
用于确定是否为web环境的算法相当简单(判断是否存在某些类),你可以使用setWebEnvironment(boolean webEnvironment)
覆盖默认行为。
应用参数
如果需要获取传递给SpringApplication.run(…)
的应用参数,你可以注入一个org.springframework.boot.ApplicationArguments
类型的bean。ApplicationArguments
接口即提供对原始String[]
参数的访问,也提供对解析成option
和non-option
参数的访问:
1 | import org.springframework.boot.* |
注 Spring Boot也会注册一个包含Spring Environment
属性的CommandLinePropertySource
,这就允许你使用@Value
注解注入单个的应用参数。
命令行参数
默认情况下,SpringApplication
会将所有命令行配置参数(以’–’开头,比如--server.port=9000
)转化成一个property
,并将其添加到Spring Environment
中。正如以上章节提过的,命令行属性总是优先于其他属性源。
如果不想将命令行属性添加到Environment
,你可以使用SpringApplication.setAddCommandLineProperties(false)
来禁用它们。
@ConfigurationProperties vs. @Value
@Value
是Spring容器的一个核心特性,它没有提供跟type-safe Configuration Properties相同的特性。下面的表格总结了@ConfigurationProperties
和@Value
支持的特性:
特性 | @ConfigurationProperties |
@Value |
---|---|---|
Relaxed绑定 | Yes | No |
Meta-data支持 | Yes | No |
SpEL 表达式 |
No | Yes |
如果你为自己的组件定义了一系列的配置keys,我们建议你将它们以@ConfigurationProperties
注解的POJO进行分组。由于@Value
不支持relaxed绑定,所以如果你使用环境变量提供属性值的话,它就不是很好的选择。最后,尽管@Value
可以写SpEL
表达式,但这些表达式不会处理来自Application属性文件的属性。
Profiles
Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只在特定的环境下生效。任何@Component
或@Configuration
都能注解@Profile
,从而限制加载它的时机:
1 | @Configuration |
以正常的Spring方式,你可以使用spring.profiles.active
的Environment
属性来指定哪个配置生效。你可以使用通常的任何方式来指定该属性,例如,可以将它包含到application.properties
中:
1 | spring.profiles.active=dev,hsqldb |
或使用命令行开关:
1 | --spring.profiles.active=dev,hsqldb |