1. 程式人生 > >SpringBoot 靜態屬性值的注入-----------使用@Value注入static屬性

SpringBoot 靜態屬性值的注入-----------使用@Value注入static屬性

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格式的資原始檔