Spring static initialization of a bean

余生颓废 提交于 2019-12-02 03:25:46

问题


Hey, how one should deal with static initializations in Spring ? I mean, my bean has a static initialization

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

And I need to take care that ErrorExceptionMapping is loaded before. I tried this:

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

But I got

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

If I omit the static initialization or call the method from within the bean's method, its of course fine. I suppose that Initialization callback (affterPropertiesSet()) wouldn't help here.


回答1:


Having static dependencies on other beans is not a Spring way.

However, if you want to keep it static, you can initialize it lazily - in that case depends-on can enforce proper initialization order.

EDIT: By lazy loading I mean something like this (I use lazy initialization with holder class idiom here, other lazy initialization idioms can be used instead):

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

and use ExceptionMappingHolder.exceptionMapping instead of exceptionMapping.




回答2:


You should be able to mark the class with the @Component annotation, then add a non static setter with @Autowired(required=true) annotation for setting the static variable.

Here's a link for more info.



来源:https://stackoverflow.com/questions/4247705/spring-static-initialization-of-a-bean

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!