2010-11-22 3 views
1

Эй, Как нужно иметь дело со статическими инициализациями весной? Я имею в виду, мой боб имеет статическую инициализациюВесна статическая инициализация компонента

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()) здесь не помог.

ответ

4

Имея static зависимости от других бобов не является весенним способом.

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

EDIT: По отложенной загрузки я имею в виду что-то вроде этого (я использую ленивую инициализацию с классом держателя идиомы здесь, другие ленивые идиомы инициализации может быть использован вместо):

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

Смежные вопросы