Spring不支持依賴注入static靜態(tài)變量
在springframework里,我們不能@Autowired一個(gè)靜態(tài)變量,使之成為一個(gè)spring bean,例如下面這樣:
@Autowired
private static YourClass yourClass;
可以試一下溃睹,yourClass在這種狀態(tài)下不能夠被依賴注入采蚀,會(huì)拋出運(yùn)行時(shí)異常java.lang.NullPointerException
梳玫,為什么呢殷勘?因?yàn)殪o態(tài)變量/類變量不是對(duì)象的屬性,而是一個(gè)類的屬性寸痢,spring則是基于對(duì)象層面上的依賴注入。
Spring如何給靜態(tài)變量注入值
1. set方法上添加@Autowired注解,類定義上添加@Component注解
@Component
public class MoneyOperationUtil {
private static Bank bank;
@Autowired
public void setBank(Bank bank) {
MoneyOperationUtil.bank= bank;
}
}
首先Spring要能掃描到MoneyOperationUtil 的bean迟隅,然后通過(guò)setter方法注入。
需要注意的是:
- 靜態(tài)成員變量上不需要再添加@Autowired注解励七。
- 雖然你添加了@Component 這個(gè)標(biāo)簽在工具類上智袭,但是你必須保證spring在加載配置文件的時(shí)(application-*.xml),其中要有配置文件開(kāi)啟了你工具類所在的包的注解掠抬。
- 如果你需要注入的靜態(tài)變量是spring未知的類(非基本數(shù)據(jù)類型和string吼野、以及非注解過(guò)的類(@Component、@controller两波、@service瞳步、@repository)),也需要讓spring管理到腰奋,就是要在spring加載的某個(gè)application-*.xml文件中配置bean单起。
- 靜態(tài)變量的setter方法的static關(guān)鍵字要去掉,不然會(huì)注入失敗氛堕。
2. xml方式實(shí)現(xiàn)
<bean id="moneyOperationUtil" class="com.*.*.MoneyOperationUtil" init-method="init">
<property name="bank" ref="bank"/>
</bean>
public class MoneyOperationUtil{
private static Bank bank;
private static MoneyOperationUtil moneyOperationUtil;
public void init() {
moneyOperationUtil = this;
moneyOperationUtil.bank = this.bank;
}
}
3. @PostConstruct方式實(shí)現(xiàn)
@Component
public class MoneyOperationUtil{
@Autowired
private static Bank bank;
private static MoneyOperationUtil moneyOperationUtil;
@PostConstruct
public void init() {
moneyOperationUtil = this;
moneyOperationUtil.bank= this.bank;
}
}
@PostConstruct 注解的方法在加載類的構(gòu)造函數(shù)之后執(zhí)行馏臭,也就是在加載了構(gòu)造函數(shù)之后,執(zhí)行init方法讼稚。這種方式和在xml中配置 init-method和 destory-method方法差不多括儒,定義spring 容器在初始化bean和容器銷(xiāo)毀之前的所做的操作。