簡體   English   中英

為什么Spring會忽略我的@DependsOn注釋?

[英]Why did Spring ignore my @DependsOn annotation?

我使用Spring 3.1.3作為webapp,使用XML配置和組件掃描。

我意識到其中一個被掃描的組件必須在其他幾個之前進行初始化。 在需要構造后初始化的所有類上,我在方法上有一個@PostConstruct注釋。

為了設置依賴順序,我將'@Component'更改為'@Component(“configData”)'在需要在其他之前構建后的類上。 然后我在每個類定義之前添加了'@DependsOn(“configData”)',需要在“configData”bean之后進行后構建。

從我讀過的內容來看,這就是我需要強制執行依賴順序的全部內容。

然后,我構建了所有內容,設置了斷點,並啟動了應用程序。 我希望在任何依賴bean之前點擊“configData”bean中的斷點。 這不是發生的事情。 第一個斷點位於其中一個依賴bean的“init”方法中。

然后我更改了我的“log4j.xml”以將“debug”設置為“org.springframework”的日志記錄級別並重新進行測試。 斷點行為是相同的,我的日志記錄沒有顯示有關Spring初始化的任何調試信息(我已經調試了log4j初始化本身,所以我確認我為“org.springframework”設置了DEBUG)。

我可能會失蹤什么?

更新:

如果重要的話,這里有幾個我在這里做的骨架例子。

@Component("configData")
public class ConfigData {
    ....
    @PostConstruct
    public void init() {
        ....
    }
}

@Component
@DependsOn("configData")
public class ClassDependentOnConfigData extends BaseClass {
    ....
    @Override
    @PostConstruct
    public void init() {
        super.init();
        ....
    }
}

重申一下,我在運行時發現的是“ClassDependentOnConfigData”中的“init()”方法是由Spring在“ConfigData”中的“init()”方法之前調用的。

另請注意,“BaseClass”對於“ConfigData”具有“@Autowired”。

(來自其他人的正確但現已刪除的答案)

@DependsOn合約僅保證已構造bean並已設置屬性。 這不保證已調用任何@PostConstruct方法。

讓它工作的方法是讓“dependee”類(其他人依賴的類)實現“InitializingBean”類,這需要實現“afterPropertiesSet()”方法。 我將我的“init()”方法的原始主體放入此方法中。 我確認現在在依賴於此的任何類之前執行此操作。

原始答案中提到的另一件事是,如果我在XML中定義了我的“dependee”bean並使用了“init-method”屬性,那么這個WOULD已經在任何依賴於它的類之前執行了。 我沒有驗證這一點。

我也遇到了同樣的問題,但仍然沒有得到妥善解決。 作為解決方案的一部分,Spring文檔說:

“除非正在使用組件掃描,否則在類級別使用DependsOn無效。”

這就是@dependsOn注釋無效的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM