2016-09-18 60 views
0

我有一個第三方jar,它提供了一個在我的項目中使用的servlet過濾器。在servlet過濾器中有一個靜態塊初始化靜態對象。如何確保Spring Beans的加載順序?

我在做什麼是使用反射來檢索靜態對象並修改它。

的配置如下:

<filter> 
    <filter-name>thirdPartyFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>thirdPartyFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

凡thirdPartyFilter以XML定義

<bean id="thirdPartyFilter" class="com.abc.ThirdPartyFilter" /> 

的ThirdPartyFilter簡單

class ThirdPartyFilter implements Filter{ 
    private static BB bb = new BB(); 
    static{ 
     bb.setText("bb"); 
    } 
    doFilter(){...} 
} 

我已經叫ThirdPartyFilterModifier的一類,在其中有一個使用反射操作的工廠bean在thirdPartyFilter中初始化的對象BB。但修飾符的定義是使用註釋。

@configuration 
class ThirdPartyFilterModifier{ 
    @Bean 
    public BB reviseBB(){ 
     // using reflection to retrieve bb and revise it. 
     return bb; 
    } 
} 

檢查控制檯日誌而應用程序啓動時,我可以清楚地看到,在ThirdPartyFilter靜態塊打印出來,然後再ThirdPartyFilterModifier的工廠bean是後話。

我承認這是我期望的結果。但這件事讓我感到困惑,因爲我沒有做任何事情來確保在thirdPartyFilterModifier之前加載thirdPartyFilter。

任何人都可以指出,如果我在xml和註釋配置中做正確的事情?

//修訂 我剛纔想的註釋轉換成XML

<bean id="thirdPartyFilterModifier" class="com.mycom.ThirdPartyFilterModifier" factory-method="reviseBB" /> 

,後thirdPartyFilter的放在這個定義&之前。得到了相同的排序結果:首先是thirdPartyFilter,然後是thirdPartyFilterModifier。

+2

你真的,真的不應該。 – chrylis

回答

0

如果您只是想確保Spring管理的任意兩個bean之間的創建順序,您可以使用depends-on

在XML:

<bean id="beanOne" class="ExampleBean" depends-on="manager"> 
    <property name="manager" ref="manager" /> 
</bean> 

在註釋:

@DependsOn 

一般:通過反射修改第三方過濾器聽起來不像是個好主意。如果可能的話,您應該嘗試尋找替代解決方案。即使在您完成這項工作後,您也會被該版本的依賴項鎖定,無法安全地更新到新版本。也許值得發佈另一個SO問題來尋找更清晰的解決方案。

+0

我只是想在我的情況下是否濫用依賴關係,因爲ThirdPartyFilter不是修飾符的屬性。 –

+0

好吧,我看到你要犯的一個更大的濫用。 :) –