2010-11-22 196 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