Spring static initialization of a bean
Solution 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
.
Solution 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.
Comments
-
lisak over 3 years
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.
-
lisak over 13 yearsI tried, look at the pasted code in the middle, but it gives me NoClassDefFoundError for the class. In this class there are tons of other classes I'd have to declare...
-
lisak over 13 yearsI suppose that would work, but I'm initializing a HashMap, so it's complicated. I better do some refactoring and do it in the spring way, it is singleton anyway, thank you