Spring static initialization of a bean

36,045

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.

Share:
36,045
lisak
Author by

lisak

Github

Updated on November 23, 2020

Comments

  • lisak
    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
    lisak over 13 years
    I 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
    lisak over 13 years
    I 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