2014-03-04 22 views
11

我正在使用Spring 3.1.3作爲webapp,使用XML配置和組件掃描。爲什麼Spring忽略我的@DependsOn註解?

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

要設置依賴性順序,我將類中的'@Component'更改爲'@Component(「configData」)',該類需要在其他類之前進行後構造。然後,我在每個需要在「configData」bean之後構造的類定義之前添加了@DependsOn(「configData」)。

從我讀過的,這是我需要執行的依賴順序。

然後我建立了一切,設置我的斷點,並啓動了應用程序。我期望在任何依賴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(); 
     .... 
    } 
} 

要重申,有什麼我發現在運行時的「的init()」中的「ClassDependentOnConfigData」方法被調用由春「的init()」方法之前在「ConfigData」。

還要注意「BaseClass」對於「ConfigData」有一個「@Autowired」。

+0

你可以張貼bean定義的configData豆(Java和/或XML),以及後應初始化一個bean它作爲一個例子嗎? –

+0

好吧,但這些只會是骨架,你會看到我的描述中顯而易見的。 –

+0

至於沒有看到Spring調試消息。你有沒有檢查你沒有全局THRESHOLD集或換句話說 - 你看到其他的DEBUG消息嗎? –

回答

5

(從別人的正確的,但現在刪除的答案)

的@DependsOn合同只保證豆已建成和屬性已設置。這不能保證任何@PostConstruct方法已被調用。

讓這個工作的方法是讓「dependee」類(別人依賴的類)實現「InitializingBean」類,它需要實現「afterPropertiesSet()」方法。我將我的「init()」方法的原始體放入此方法中。我證實了這一點現在在任何依賴於此的類之前執行。

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

+0

感謝您再次添加答案,我一直在尋找這個解決方案兩天! –

4

我也遇到過同樣的問題,但還是沒有妥善解決。作爲一種解決方案Spring文檔的一部分表示:

「在類級使用DependsOn沒有影響,除非在使用組件的掃描。「

這就是爲什麼@DependsOn註解沒有效果的原因。