使用Java类加载SpringBoot、SpringCloud配置文件

Posted by 石玉军 on 2018-08-16

我们都知道平常在使用SpringBoot和SpringCloud的时候,如果需要加载一两个配置文件的话我们通常使用@Value("${属性名称}")注解去加载。但是如果配置文件属性特别多的时候使用这种方式就显得特别的不友好了。

比如说,我们要加载下方这个名为application.yml的配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


kafka:
brokerAddress: 110.35.113.62:9092,123.27.143.72:9095,180.17.133.52:9096

smsTopic: testTopic
smsCosumeGroup: testTopicGroup

timerTaskTopic: timerTopic
timerTaskGroup: timerGroup

jvmNumbers: 3



security:
authentication:
jwt:
secret: 0550224055e1848081dba46d8ad325f503fa141b
tokenValidityInSeconds: 86400

此时我们有两种方式来简化这个加载方式

1

这种方式呢,是同过层层嵌套的方式一层一层的按照配置文件属性的方式来进行注入的。大家只要把这个类跟上方提供的配置文件进行对比就会明白它的方式了。(注意,下方的所有属性因为篇幅问题没有增加get、set方法,实际使用过程中请自行添加)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@ConfigurationProperties(prefix = "application", ignoreUnknownFields = false)
public class ApplicationProperties1 {

private final Security security = new Security();

private final Kafka kafka = new Kafka();

public static class Kafka {
private String brokerAddress;
private String smsTopic;
private String smsCosumeGroup;
private String timerTaskTopic;
private String timerTaskGroup;
private String jvmNumbers;
}

public static class Security {

private final Authentication authentication = new Authentication();

public static class Authentication {

private final Jwt jwt = new Jwt();

public static class Jwt {

private String secret;

private long tokenValidityInSeconds;

}
}
}

}

2

这种方式就是以指定的配置前缀为依据去取配置(同上没有写get、set方法)

例如:kafka的配置可以这样来

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
@ConfigurationProperties(prefix = "kafka",ignoreUnknownFields = false)
@PropertySource(value = { "classpath:application.yml" },ignoreResourceNotFound=false)
public class ApplicationProperties {

private String brokerAddress;
private String smsTopic;
private String smsCosumeGroup;
private String timerTaskTopic;
private String timerTaskGroup;
private String jvmNumbers;
}

而Security的配置这样来

1
2
3
4
5
6
7
8
9
@Configuration
@ConfigurationProperties(prefix = "security.authentication.jwt",ignoreUnknownFields = false)
@PropertySource(value = { "classpath:application.yml" },ignoreResourceNotFound=false)
public class ApplicationProperties {

private String secret;

private long tokenValidityInSeconds;
}

补充

大家可能会注意到我上方的几个类中都没有写get和set方法,因为那个东西其实所占的篇幅实在是太长了。那么,有什么办法可以补救么,其实是有办法的,一个注解就可以全搞定哟。

什么?你不信,不信来看看呀:IDEA中使用lombok插件

结语

怎么样,学会这个以后Leader还会担心你的代码臃肿么。

本文出自http://zhixiang.org.cn,转载请保留。