2010-11-22 197 views
1

嘿, 如何處理Spring中的靜態初始化?我的意思是,我的bean有一個靜態的初始化Spring的靜態初始化

private static final Map<String, String> exceptionMapping = ErrorExceptionMapping.getExceptionMapping(); 

我需要注意ErrorExceptionMapping之前加載。我嘗試這樣做:

<bean id="errorExceptionMapping" class="cz.instance.transl.util.ErrorExceptionMapping" /> 
<bean id="validateService" class="cz.instance.transl.services.ValidateService" depends-on="errorExceptionMapping" > 

但我得到

java.lang.NoClassDefFoundError: Could not initialize class cz.instance.transl.util.ErrorExceptionMapping 

如果我省略了靜態初始化或從bean的方法中調用該方法,它當然很好。我想初始化回調(affterPropertiesSet())在這裏沒有幫助。

回答

4

擁有static依賴於其他bean不是Spring方式。

但是,如果你想保留它static,你可以懶惰地初始化它 - 在這種情況下,depends-on可以強制執行正確的初始化順序。

編輯:通過延遲加載我的意思是這樣(我用的延遲初始化與holder類成語在這裏,其他延遲初始化成語可以用來代替):

private static class ExceptionMappingHolder { 
    private static final Map<String, String> exceptionMapping = 
     ErrorExceptionMapping.getExceptionMapping(); 
} 

,並使用ExceptionMappingHolder.exceptionMapping代替exceptionMapping

+0

我試過了,看看中間粘貼的代碼,但它給了我的NoClassDefFoundError類。在這個班級裏有很多其他班級我不得不申報... – lisak 2010-11-22 16:54:14

3

您應該能夠用@Component註釋標記該類,然後添加一個帶有@Autowired(required=true)註釋的非靜態設置器來設置靜態變量。

Here's a link欲瞭解更多信息。

+1

我想這會工作,但我正在初始化一個HashMap,所以它很複雜。我最好做一些重構,並在春季做它,無論如何,這是單身,謝謝 – lisak 2010-11-22 17:02:04