Пружинная статическая инициализация боба

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

Решение

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

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

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

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

и использовать ExceptionMappingHolder.exceptionMapping вместо exceptionMapping,

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

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

Другие вопросы по тегам