Spring Boot 属性配置和使用

 

3.2.2.2 Java Config 使用方式

假设我有一个 TestJavaConfigBean,通过 Java Config 的方式还可以使用 @Value 的方式注入:

public class TestJavaConfigBean {
  @Value("${timeout:100}")
  private int timeout;
  private int batch;

@Value("${batch:200}")
public void setBatch(int batch) {
this.batch = batch;
}

public int getTimeout() {
return timeout;
}

public int getBatch() {
return batch;
}
}

 

在 Configuration 类中按照下面的方式使用(假设应用默认的 application namespace 中有timeoutbatch的配置项):

@Configuration
@EnableApolloConfig
public class AppConfig {
  @Bean
  public TestJavaConfigBean javaConfigBean() {
    return new TestJavaConfigBean();}
}

 

3.2.2.3 ConfigurationProperties 使用方式

Spring Boot 提供了@ConfigurationProperties把配置注入到 bean 对象中。

Apollo 也支持这种方式,下面的例子会把redis.cache.expireSecondsredis.cache.commandTimeout分别注入到 SampleRedisConfig 的expireSecondscommandTimeout字段中。

@ConfigurationProperties(prefix = "redis.cache")
public class SampleRedisConfig {
  private int expireSeconds;
  private int commandTimeout;

public void setExpireSeconds(int expireSeconds) {
this.expireSeconds = expireSeconds;
}

public void setCommandTimeout(int commandTimeout) {
this.commandTimeout = commandTimeout;
}
}

 

在 Configuration 类中按照下面的方式使用(假设应用默认的 application namespace 中有redis.cache.expireSecondsredis.cache.commandTimeout的配置项):

@Configuration
@EnableApolloConfig
public class AppConfig {
  @Bean
  public SampleRedisConfig sampleRedisConfig() {
    return new SampleRedisConfig();}
}

 

https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97
Spring boot 中 yml 配置文件的缩进是按前面字母的,不是以后面 ":" 为参照物的

注解是 javaSE5 中的重要的语言变化之一。
它们可以提供用来完整地描述程序所需的信息,而这些信息是无法用 java 来表达的。
因此注解可以用来生成描述文件,甚至或是新的类定义,并且有助于减轻编写”样板“代码的负担。
通过使用注解,可以将这些元素数据保存在 Java 源代码中,并利用 annotation API 为自己的注解构造处理工具,

同时,注解的优点还包括:更加干净易读的代码以及编译期类型检查等。


注解中定义了名为value的元素,并且在应用该注解的时候,如果该元素是唯一需要赋值的一个元素,那么无需使用名 - 值对的这种语法,而只需在括号内给出 value 元素所需的值即可。这可以应用于任何合法类型的元素。
当然了,这也限制了程序员必须将此元素命名为value

Spring Boot 属性配置和使用
Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置。
Spring Boot 入门 请看:http://blog.csdn.net/isea533/article/details/50278205

Spring Boot 支持多种外部配置方式

这些方式优先级如下:

  1. 命令行参数
  2. 来自java:comp/env的 JNDI 属性
  3. Java 系统属性(System.getProperties()
  4. 操作系统环境变量
  5. RandomValuePropertySource配置的random.*属性值
  6. jar包外部的application-{profile}.propertiesapplication.yml( 带spring.profile) 配置文件
  7. jar包内部的application-{profile}.propertiesapplication.yml( 带spring.profile) 配置文件
  8. jar包外部的application.propertiesapplication.yml( 不带spring.profile) 配置文件
  9. jar包内部的application.propertiesapplication.yml( 不带spring.profile) 配置文件
  10. @Configuration注解类上的@PropertySource
  11. 通过SpringApplication.setDefaultProperties指定的默认属性

命令行参数

通过java -jar app.jar --name="Spring" --server.port=9090方式来传递参数【-- 传参的方式,只能在 java -jar xxx.jar 后面】。

参数用--xxx=xxx的形式传递。

可以使用的参数可以是我们自己定义的,也可以是 Spring Boot 中默认的参数。

很多人可能会关心如 web 端口如何配置这样的问题,这些都是 Spring Boot 中提供的参数,部分可用参数如下:

# LOGGING
logging.path=/var/logs
logging.file=myapp.log
logging.config= # location of config file (default classpath:logback.xml for logback)
logging.level.*= # levels for loggers, e.g. "logging.level.org.springframework=DEBUG" (TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF)

# EMBEDDED SERVER CONFIGURATION (ServerProperties)
server.port=8080
server.address= # bind to a specific NIC
server.session-timeout= # session timeout in seconds
server.context-parameters.*= # Servlet context init parameters, e.g. server.context-parameters.a=alpha
server.context-path= # the context path, defaults to '/'
server.servlet-path= # the servlet path, defaults to '/'

更多常见的应用属性请浏览这里

注意:命令行参数在app.jar的后面!

可以通过SpringApplication.setAddCommandLineProperties(false)禁用命令行配置。

Java 系统属性

注意 Java 系统属性位置java -Dname="isea533" -jar app.jar,可以配置的属性都是一样的,优先级不同。

例如java -Dname="isea533" -jar app.jar --name="Spring!"name值为Spring!

操作系统环境变量

配置过 JAVA_HOME 的应该都了解这一个。

这里需要注意的地方,有些 OS 可以不支持使用.这种名字,如server.port,这种情况可以使用SERVER_PORT来配置。

具体名字如何匹配,看本文后面。

RandomValuePropertySource

系统中用到随机数的地方,例如:

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

random.int*支持value参数和,max参数,当提供max参数的时候,value就是最小值。

应用配置文件(.properties 或.yml)

在配置文件中直接写:

name=Isea533
server.port=8080

.yml格式的配置文件如:

name: Isea533
server:
    port: 8080

当有前缀的情况下,使用.yml格式的配置文件更简单。关于.yml配置文件用法请看这里

注意:使用.yml时,属性名的值和冒号中间必须有空格,如name: Isea533正确,name:Isea533就是错的。

属性配置文件的位置

spring 会从 classpath 下的/config目录或者 classpath 的根目录查找application.propertiesapplication.yml

/config优先于classpath根目录

@PropertySource

这个注解可以指定具体的属性配置文件,优先级比较低。

SpringApplication.setDefaultProperties

例如:

SpringApplication application = new SpringApplication(Application.class);
Map<String, Object> defaultMap = new HashMap<String, Object>();
defaultMap.put("name", "Isea-Blog");
// 还可以是 Properties 对象
application.setDefaultProperties(defaultMap);
application.run(args);

应用(使用)属性

@Value(“${xxx}”)

这种方式是最简单的,通过@Value注解可以将属性值注入进来。

@ConfigurationProperties

Spring Boot 可以方便的将属性注入到一个配置对象中。例如:

my.name=Isea533
my.port=8080
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com

对应对象:

@ConfigurationProperties(prefix="my")
public class Config {
    private String name;
    private Integer port;
    private List<String> servers = new ArrayList<String>();
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">geName</span><span class="hljs-params">()</span>{
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>.name;
}

<span class="hljs-keyword">public</span> Integer <span class="hljs-title function_">gePort</span><span class="hljs-params">()</span>{
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>.port;
}
<span class="hljs-keyword">public</span> List&lt;String&gt; <span class="hljs-title function_">getServers</span><span class="hljs-params">()</span> {
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>.servers;
}

}

Spring Boot 会自动将prefix="my"前缀为my的属性注入进来。

Spring Boot 会自动转换类型,当使用List的时候需要注意在配置中对List进行初始化!

Spring Boot 还支持嵌套属性注入,例如:

name=isea533
jdbc.username=root
jdbc.password=root
...

对应的配置类:

@ConfigurationProperties
public class Config {
    private String name;
    private Jdbc jdbc;
    class Jdbc {
        private String username;
        private String password;
        //getter...
    }
<span class="hljs-keyword">public</span> Integer <span class="hljs-title function_">gePort</span><span class="hljs-params">()</span>{
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>.port;
}
<span class="hljs-keyword">public</span> Jdbc <span class="hljs-title function_">getJdbc</span><span class="hljs-params">()</span> {
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>.jdbc;
}

}

jdbc开头的属性都会注入到Jdbc对象中。

在 @Bean 方法上使用 @ConfigurationProperties

例如:

@ConfigurationProperties(prefix = "foo")
@Bean
public FooComponent fooComponent() {
    ...
}

Spring Boot 会将foo开头的属性按照名字匹配注入到FooComponent对象中。

属性占位符

例如:

app.name=MyApp
app.description=${app.name} is a Spring Boot application

可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)。

通过如${app.name:默认名称}方法还可以设置默认值,当找不到引用的属性时,会使用默认的属性。

由于${}方式会被 Maven 处理。如果你 pom 继承的spring-boot-starter-parent,Spring Boot 已经将maven-resources-plugins默认的${}方式改为了@ @方式,例如@name@

如果你是引入的 Spring Boot,你可以修改使用其他的分隔符

通过属性占位符还能缩短命令参数

例如修改 web 默认端口需要使用--server.port=9090方式,如果在配置中写上:

server.port=${port:8080}

那么就可以使用更短的--port=9090,当不提供该参数的时候使用默认值8080

属性名匹配规则

例如有如下配置对象:

@Component
@ConfigurationProperties(prefix="person")
public class ConnectionSettings {
<span class="hljs-keyword">private</span> String firstName;

}

firstName可以使用的属性名如下:

  1. person.firstName,标准的驼峰式命名
  2. person.first-name,虚线(-)分割方式,推荐在.properties.yml配置文件中使用
  3. PERSON_FIRST_NAME,大写下划线形式,建议在系统环境变量中使用

属性验证

可以使用JSR-303注解进行验证,例如:

@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {
<span class="hljs-meta">@NotNull</span>
<span class="hljs-keyword">private</span> InetAddress remoteAddress;

<span class="hljs-comment">// ... getters and setters</span>

}

最后

以上是 Spring Boot 属性配置和使用的内容,有些不全面的地方或者读者有更多疑问,可以查看Spring Boot 完整文档 或 Externalized Configuration

关于 Spring Boot 更多的内容可以继续关注本博客。

Spring Boot 系列

由于我博客 Spring Boot 系列文章还不够多,所以暂时不打算创建专栏,如果再多几篇我就建专栏。

  1. Spring Boot 入门

  2. Spring Boot 属性配置和使用

  3. Spring Boot 集成 MyBatis

  4. Spring Boot 静态资源处理

http://blog.csdn.net/isea533/article/details/50281151