@DepnedsOn解決一個spring啓動問題

前言

最近遇到了一個啓動失敗的問題,原因是在bean初始化完成之後的鉤子方法中使用獲取容器中bean的工具類,(對應工具類之前的一篇博客 獲取springbean)。

分析

這裏具體的場景是我想實現一個bean在鉤子方法中往一個策略map中註冊自己作爲一個策略使用,但是在啓動的時候報錯:

第33行代碼如下:

 public static <T> T getBean(@NotNull Class<T> tClass) {
        return context.getBean(tClass);
    }

可以看到可能爲空的是context,這個是通過在項目中啓動時注入到ApplicationContextUtil中的靜態變量context,很明顯是在當前這個bean啓動的時候,其鉤子方法去調用這個變量還沒實現context的注入。

   @Override
    public void afterPropertiesSet() throws Exception {
       // 策略工廠中註冊 自身 的代碼
    }

解決

這裏主要是一個場景,其實在bean啓動的時候是依賴ApplicationContextUtil這個bean的,但是因爲getBean方法都static方法,在平常業務代碼中調用都是容器啓動完畢的時候,所以沒有問題,但是這裏是想實現在bean初始化時自動通過鉤子往一個map工廠中註冊bean實例,且該bean沒有顯示的@Resource依賴ApplicationContextUtil,所以在註冊的時候applicationContextutil這個bean還沒初始化好,這裏在這些具體策略的類上加了@DependsOn(“applicationContextUtil”)

@Service
@Slf4j
@DependsOn(value = "applicationContextUtil")
public class AStrategy extends AbstractStrategy {
}

這表示這個bean的初始化是依賴 applicationContextUtil 這個bean初始化完成之後(也就是靜態變量上下文被注入)纔去初始化的,這樣啓動就不會報NPE了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章