Пружинная статическая инициализация боба - PullRequest
2 голосов
/ 22 ноября 2010

Эй, как бороться со статической инициализацией в 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

Если я опущу статическую инициализацию или вызову метод из метода бина, это, конечно, хорошо. Я полагаю, что обратный вызов инициализации (affterPropertiesSet ()) здесь не поможет.

Ответы [ 2 ]

4 голосов
/ 22 ноября 2010

Наличие static зависимостей от других компонентов не является способом Spring.

Однако, если вы хотите сохранить его static, вы можете его инициализировать лениво - в этом случае depends-on может обеспечить правильный порядок инициализации.

РЕДАКТИРОВАТЬ: Под ленивой загрузкой я имею в виду что-то вроде этого (здесь я использую ленивую инициализацию с идиомой класса держателя, вместо этого могут использоваться другие идиомы ленивой инициализации):

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

и используйте ExceptionMappingHolder.exceptionMapping вместо exceptionMapping.

3 голосов
/ 22 ноября 2010

Вы должны иметь возможность пометить класс аннотацией @Component, а затем добавить нестатический установщик аннотацией @Autowired(required=true) для установки статической переменной.

Вот ссылка для получения дополнительной информации.

...