SpringBoot中靜態變量注入

開發過程當中可能會寫一些工具類,爲了調用方便,通常工具類中的方法都習慣使用靜態方法的方式,可是有的場景中,工具類中須要依賴注入其餘加了@Component註解的交由Spring容器管理的類。靜態方法中調用成員變量的時候須要成員變量也是靜態的。那麼問題來了,學挖掘機到底哪家強?當使用框架

@Autowired
priavte static BeanClass beanname;

的時候,在方法中沒法實例化這個變量,就會出現NullPointerException。具體緣由是什麼呢?工具

  • 靜態變量不是對象的屬性,而是類的屬性。this

  • 類加載的時候已經初始化好此變量。指針

  • 初始化此變量時還未經過Spring容器實例化。code

以上緣由致使了,這個對象是null,因此在調用的時候回出現空指針異常。那麼怎麼解決這個問題呢?目前來講有三種方法,一種是經過xml配置去解決,可是SpringBoot框架簡化了配置文件這種繁瑣的存在,因此這裏咱們再也不贅述,主要講另外兩種方法,一個也仍是經過@Autowired註解,另外一種是經過@PostConstruct註解。如下是具體實現。xml

  • @Autowired
priavte static BeanClass beanname;

public static BeanClass getBeanname(){
	return beanname;
}

@Autowired
public void setBeanname(BeanClass bean){
	Utils.beanname = bean;
}

此處爲變量添加get set方法,必定要注意,這裏的set方法不是靜態的,不然會出現和上邊同樣的問題,仍是沒法實例化對象。並且,BeanClass必定是要添加@Component註解或者相似註解,可讓Spring容器掃描到,並且成員變量上不須要再加@Autowired註解。對象

  • @PostConstruct

首先在當前類上添加@Component註解,讓Spring容器能掃描到。開發

priavte static BeanClass beanname;

@Autowired
private BeanClass beanname2;

public static BeanClass getBeanname(){
	return beanname;
}

public void setBeanname(){
	Utils.beanname = beanname2;
}

@PostConstruct
public void init(){
	this.setBeanname();
}

此處的set方法同上,同樣不能用靜態修飾,此處會有編譯異常,具體緣由我就不說了。get

這樣能夠實如今工具類中,爲一個靜態變量實現依賴注入了。固然,既然是工具類,仍是儘可能不要這麼複雜了。it

相關文章
相關標籤/搜索