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格式的资源文件