SpringBoot 靜態屬性值的注入-----------使用@Value注入static屬性
阿新 • • 發佈:2019-02-19
spring 不允許/不支援把值注入到靜態變數中,因為Spring 依賴注入是依賴 set方法set方法是普通的物件方法,而被static修飾的屬性欄位是屬於類變數,所以無法注入。
當我們需要給一個配置類的static屬性賦值時:private static String clusterName;
當我們給clusterName屬性賦值時,思路就是將靜態屬性的靜態set方法覆寫成普通的set方法(也就是去掉static修飾),覆寫其靜態的set方法:
@Value("${spring.elasticsearch.cluster.name}")
public void setClusterName(String clusterName) {
ElasticSearchConfiguration.clusterName = clusterName;
}
注意:這裡的set方法是沒有使用static修飾的
一個類例項如下:
package com.caict.core.config; import com.alibaba.fastjson.JSON; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; /** * @Author : fengx * @Date : 2018/6/25 16:06 * @Description * @Version 1.0 */ @Component @ConfigurationProperties @PropertySource("classpath:nginx.properties") public class ElasticSearchConfiguration { /** ES叢集 */ private static String[] hosts; /** ES埠配置 */ private static int port; /** ES是否啟動自動嗅探機制 */ private static boolean sniff; /** ES叢集名稱 */ private static String clusterName; /** 超時時間 */ private static String timeout; @Override public String toString() { return JSON.toJSONString(this); } public static String[] getHosts() { return hosts; } @Value("${spring.elasticsearch.hosts}") public void setHosts(String[] hosts) { ElasticSearchConfiguration.hosts = hosts; } public static int getPort() { return port; } @Value("${spring.elasticsearch.port}") public void setPort(int port) { ElasticSearchConfiguration.port = port; } public static boolean isSniff() { return sniff; } @Value("${spring.elasticsearch.client.transport.sniff}") public void setSniff(boolean sniff) { ElasticSearchConfiguration.sniff = sniff; } public static String getClusterName() { return clusterName; } @Value("${spring.elasticsearch.cluster.name}") public void setClusterName(String clusterName) { ElasticSearchConfiguration.clusterName = clusterName; } public static String getTimeout() { return timeout; } @Value("${spring.elasticsearch.client.transport.ping.timeout}") public void setTimeout(String timeout) { ElasticSearchConfiguration.timeout = timeout; } }
對應的配置檔案
#elasticSearch配置
spring.elasticsearch.hosts=ES叢集IP
spring.elasticsearch.port=9300
spring.elasticsearch.client.transport.sniff=true
spring.elasticsearch.cluster.name=elasticsearch
spring.elasticsearch.client.transport.ping.timeout=20s
注:SpringBoot的配置檔案注入好像不支援.yml格式的資原始檔,只能使用*.properties格式的資原始檔