2010-11-22 1 views
1

안녕하세요, 스프링에서 정적 초기화를 처리하는 방법은 무엇입니까? 내 bean에 정적 ​​초기화가있다.스프링의 정적 초기화 스프링

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은 적절한 초기화 순서를 적용 할 수 있습니다.

는 편집 : 이런 식으로 뭔가 (내가 다른 게으른 초기화 숙어 대신 사용할 수 있습니다 여기 홀더 클래스 관용구와 게으른 초기화를 사용)을 의미 게으른로드하여는 :

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

ExceptionMappingHolder.exceptionMapping 대신 exceptionMapping 사용 .

+0

중간에 붙여 넣은 코드를 보았습니다.하지만 클래스에 대해 NoClassDefFoundError를 제공합니다. 이 수업에는 내가 선언해야 할 다른 수업이 많이 있습니다. – lisak

+0

@lisak : 업데이트되었습니다. – axtavt

3

클래스를 @Component 주석으로 표시하고 정적 변수 설정을 위해 @Autowired(required=true) 주석이 포함 된 비 정적 setter를 추가 할 수 있어야합니다.

Here's a link 자세한 내용은

+1

그럴 것이라고 생각하지만, HashMap을 초기화 중이므로 복잡합니다. 좀 더 나은 리팩토링을하고 스프링 방식으로 해보십시오. 어쨌든 싱글 톤입니다. 감사합니다. – lisak