開發過程當中可能會寫一些工具類,爲了調用方便,通常工具類中的方法都習慣使用靜態方法的方式,可是有的場景中,工具類中須要依賴注入其餘加了@Component註解的交由Spring容器管理的類。靜態方法中調用成員變量的時候須要成員變量也是靜態的。那麼問題來了,學挖掘機到底哪家強?當使用
框架
@Autowired priavte static BeanClass beanname;
的時候,在方法中沒法實例化這個變量,就會出現NullPointerException。具體緣由是什麼呢?
工具
靜態變量不是對象的屬性,而是類的屬性。this
類加載的時候已經初始化好此變量。指針
初始化此變量時還未經過Spring容器實例化。code
以上緣由致使了,這個對象是null,因此在調用的時候回出現空指針異常。那麼怎麼解決這個問題呢?目前來講有三種方法,一種是經過xml配置去解決,可是SpringBoot框架簡化了配置文件這種繁瑣的存在,因此這裏咱們再也不贅述,主要講另外兩種方法,一個也仍是經過@Autowired註解,另外一種是經過@PostConstruct註解。如下是具體實現。
xml
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註解。
對象
首先在當前類上添加@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