spring 如何將配置信息注入靜態變量

咱們學習過將配置信息經過@Value()的方法注入到對象的變量中。這是因爲對象是由spring統一託管的(保證了單例模式)。那於對於非spring託管的類,若是注入注入數據呢?java

好比:咱們想把配置信息的值,注入到類的靜態變量中。redis

錯誤作法

application.propertiesspring

spring.redis.host=test
@Component
public class RedisServiceImpl implements RedisService {
    ...
    @Value("${spring.redis.host}")
    static public String host;
    
    @Value("${spring.redis.port}")
    static public Integer port;
    ...
    
     static public JedisPool getJedisPool() {
        if (RedisServiceImpl.host == null) {
            logger.info("host 未注入");
        }
    }

控制檯打印爲: "host 未注入app

正確的方法

@Component
public class RedisServiceImpl implements RedisService {
    ...
    static public String host;
    static public Integer port;
    
    @Value("${spring.redis.host}")
    public void setHost(String host) {
        RedisServiceImpl.host = host;
    }

    @Value("${spring.redis.port}")
    public void setPort(Integer port) {
        RedisServiceImpl.port = port;
    }
    ...
    
     static public JedisPool getJedisPool() {
        if (RedisServiceImpl.host == null) {
            logger.info("host 未注入");
        } else {
            logger.info("host 值爲" + RedisServiceImpl.host);
        }
    }

控制檯正確的打印了注入的值。學習

緣由猜測

spring在啓動時會進行組件掃描,打描到RedisServiceImpl時,發現其類使用了@Component註解。因而,初始化對象 RedisServiceImpl。初始化過程當中,對方法進行掃描,當掃描到使用@Value註解的方法時,調用方法,並注入須要注入的值。code

而後:咱們使用了一個小的技巧: 在這個自動執行的方法中,將值設置給了類。進而實現了,在啓動時將值注入到類的目標。對象

其實:spring不對類進行託管,因此也就不可能將值注入到類。因此咱們的上述方法,應該描述爲:將值注入給方法,而後在方法中,使用傳入的值爲類進行數據初始化。get

這時,咱們也就清楚爲何使用@Value()註解時,沒法將值注入的緣由了:
若是將@Value(),直接加到靜態私有變量上,則在初始化對象時,因爲靜態私有變量屬於類,因此spring未對類進行操做 -- 錯誤。io

相關文章
相關標籤/搜索