咱們學習過將配置信息經過@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