Spring的@Value注解在构造函数中应用的注意点

在改造一个之前的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进行注入了

猜你喜欢

转载自blog.csdn.net/achang07/article/details/79419006