복붙노트

[SPRING] 빈의 스프링 정적 초기화

SPRING

빈의 스프링 정적 초기화

이봐 요, Spring에서 정적 초기화를 처리하는 방법은 무엇입니까? 내 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

정적 초기화를 생략하거나 bean 메소드 내에서 메소드를 호출하면 물론 괜찮습니다. 초기화 콜백 (affterPropertiesSet ())이 도움이되지 않는다고 생각합니다.

해결법

  1. ==============================

    1.다른 bean에 정적 ​​의존성을 갖는 것은 스프링 방식이 아닙니다.

    다른 bean에 정적 ​​의존성을 갖는 것은 스프링 방식이 아닙니다.

    그러나 정적으로 유지하려는 경우 지연 시간을 초기화 할 수 있습니다.이 경우 depends-on은 적절한 초기화 순서를 적용 할 수 있습니다.

    편집 : 게으른 로딩에 의해 나는 (여기에 홀더 클래스 관용구로 게으른 초기화를 사용하고, 다른 게으른 초기화 관용구를 대신 사용할 수있다.) 이와 같은 것을 의미한다.

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

    예외 맵핑 대신 ExceptionMappingHolder.exceptionMapping을 사용하십시오.

  2. ==============================

    2.@Component 주석으로 클래스를 표시 한 다음 정적 변수를 설정하기 위해 @Autowired (required = true) 주석이없는 정적 세트 작성기를 추가 할 수 있어야합니다.

    @Component 주석으로 클래스를 표시 한 다음 정적 변수를 설정하기 위해 @Autowired (required = true) 주석이없는 정적 세트 작성기를 추가 할 수 있어야합니다.

    더 많은 정보를 얻을 수있는 링크가 있습니다.

  3. from https://stackoverflow.com/questions/4247705/spring-static-initialization-of-a-bean by cc-by-sa and MIT license