在改造一个之前的SpringMVC项目,重新使用SpringBoot的架构。
有一个自定义属性读取的转换过程,这里记录一下。
SpringMVC下的属性读取
项目使用MongoDB数据库,直接使用MongoDB-Driver中的MongoClient进行编程,创建MongoClient实例时,需要主机地址和端口号。
这个主机地址和端口号在开发环境、测试环境、生产环境是不同的,因此通过配置文件进行了配置,然后再程序执行的时候读取这些属性。
pom中的Profile配置
<profiles>
<!-- 开发环境,默认激活 -->
<profile>
<id>dev</id>
<properties>
<mongo.host>localhost</mongo.host>
<mongo.port>27017</mongo.port>
</properties>
<activation>
<activeByDefault>true</activeByDefault><!-- 这里表示默认环境 -->
</activation>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<mongo.host>localhost</mongo.host>
<mongo.port>27017</mongo.port>
</properties>
</profile>
<!-- 预上线环境 -->
<profile>
<id>pre</id>
<properties>
<mongo.host>localhost</mongo.host>
<mongo.port>27017</mongo.port>
</properties>
</profile>
<!-- 生产环境 -->
<profile>
<id>prd</id>
<properties>
<mongo.host>localhost</mongo.host>
<mongo.port>27017</mongo.port>
</properties>
</profile>
</profiles>
上面已经将真正的主机地址都替换为localhost,实际上各个环境下是不一致的。端口号使用默认端口号27017。
自定义属性配置文件
创建一个自定义属性的配置文件,譬如mongo.properties,写入相关配置。
mongo.host = ${mongo.host}
mongo.port = ${mongo.port}
代码中读取自定义属性
ResourceBundle resource = ResourceBundle.getBundle("mongo");
String host = resource.getString("mongo.host");
String port = resource.getString("mongo.port");
这里是通过ResourceBundle进行的读取,这是一个可以根据本地环境读取不同配置文件的类,这里我们简单实用,不传入locale,直接读取唯一的配置文件中的键值对即可。
如上,便是在SpringMVC项目中读取自定义属性的相关内容。
SpringBoot下自定义属性注入
SpringBoot实现起来就比较简洁一些了,可以使用@Value注解直接注入自定义属性。
application.properteis配置
SpringBoot的配置一般都放在application.properties中,为了区分开发、测试、生产环境等,可以增加后缀生成各个环境下独立的配置文件,如下:
而在各个properties中配置不同的值。
同时在pom中也要配置相应的Profile,这里属性配置一个env即可,然后再application.properties中通过如下的配置引入对应活动环境下的配置:
spring.profiles.active=${env}
代码中@Value注入
在代码中通过@Value可以直接把自定义的属性值注入进去。
@Value("${mongodb.host}")
String mongoHost;
@Value("${mongodb.port}")
String mongoPort;
需要注意的地方
因为在项目中这些自定义的属性需要在Spring Bean的构造函数中使用,所以这里有一些不同。
上面的示例中是在Bean的成员变量上使用@Value进行了注入,而成员变量的注入按照个人的理解应该是在Bean创建成功之后,通过setter方法进行注入的。
那么如果要在构造函数中使用这个值的话,就不能这样来用了。
public XXXDao(@Value("${mongodb.host}") String mongoHost, @Value("${mongodb.port}") String mongoPort) {
if (mongoClient == null) {
mongoClient = new MongoClient(mongoHost, Integer.valueOf(mongoPort));
db = mongoClient.getDatabase("xxx");
collection = db.getCollection("xxx");
}
}
如上,此时就应该在构造函数的参数上使用@Value进行注入了!