Пружинная статическая инициализация боба
Привет, как бороться со статической инициализацией в 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)
аннотация для установки статической переменной.
Вот ссылка для получения дополнительной информации.