Spring Boot @Component注解下的類 @Autowired 為null【原文】
@Component
public class ComponentClass {
@Autowired
private JedisClient jedisClient;
public static ComponentClass componentClass;
@PostConstruct
public void init(){
componentClass = this;
componentClass.jedisClient = this.jedisClient;
}
}
// 后續使用 componentClass.jedisClient.**()
沒注入成功,或者說是此類在bean加載之前就被調用了。
聲明一個此類的靜態變量,用以保存bean。
使用@PostConstruct注解,將需要注入的類添加到靜態變量中。
接下來,使用這個靜態變量來調用注入類就行了。
@PostConstruct這個注解的具體作用就是:
注解在方法上,表示此方法是在Spring實例化該bean之后馬上執行此方法,之后才會去實例化其他bean。
這樣在Spring實例化ComponentClass之后,馬上執行此方法,初始化ComponentClass靜態對象和成員變量jedisClient。
spring中Constructor、@Autowired、@PostConstruct的順序 【原文】
其實從依賴注入的字面意思就可以知道,要將對象p注入到對象a,那么首先就必須得生成對象p與對象a,才能執行注入。所以,如果一個類A中有個成員變量p被@Autowired注解,那么@Autowired注入是發生在A的構造方法執行完之后的。
如果想在生成對象時候完成某些初始化操作,而偏偏這些初始化操作又依賴於依賴注入,那么就無法在構造函數中實現。為此,可以使用@PostConstruct注解一個方法來完成初始化,@PostConstruct注解的方法將會在依賴注入完成后被自動調用。
Constructor >> @Autowired >> @PostConstruct
public Class AAA {
@Autowired
private BBB b;
public AAA() {
System.out.println("此時b還未被注入: b = " + b);
}
@PostConstruct
private void init() {
System.out.println("@PostConstruct將在依賴注入完成后被自動調用: b = " + b);
}
}