2016-06-14 3 views
2

나는 그런 봄 부팅 테스트가 있습니다SpringApplicationConfiguration에서 설정 클래스를 선언하는 순서. 봄 부팅

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = { 
    PropertyConfig.class, 
    ServiceConfigA.class, 
    ServiceConfigB.class} 
) 
public class SpringTest { 

    @Test 
    public void test() { 
    ... 
    } 
} 

PropertyConfig 내부 콩을 무시하고 서비스 CONFIGS에서 콩 일부 필드를 autowire하기 수 없기 때문에 나는 컨텍스트 초기화 오류 클래스의 목록에 첫 번째 선언 PropertyConfig 클래스입니다. 내가 PropertyConfig 일부 serivce 구성 후 이동 후 PropertyConfig 안의 콩을 초기화했습니다.

PropertyConfig에는 PropertiesFactoryBeanPropertySourcesPlaceholderConfigurer 두 개의 빈이 포함되어 있습니다. 원인이 PropertySourcesPlaceholderConfigurer에 존재하지 않습니다. 서비스 구성의 bean이 @Value 주석이있는 자동 추가 필드를 사용할 수 없습니다 (자동으로 String에서 Integer로 변환 할 수 없음).

내 질문에 왜 PropertyConfig 콩은 첫 번째 경우 초기화되지 않습니다? 스프링 부트 테스트에서 설정로드의 일부 기능이 있습니까?

+0

'PropertySourcesPlaceholderConfigurer' 빈을'static'으로 만들 수 있도록 조언 해 주시겠습니까? –

답변

0

스프링 스캔은 의존성을 CI 컨테이너에 등록하고 초기화 순서를 결정합니다. 당신이 말하는 주문은 전혀 관련이 없습니다.

당신에게 적합하지 않은 경우 배선에 다른 문제가있을 수 있습니다. 하지만 당신은 우리에게 당신의 코드를 보여주지 못했습니다. 근본 원인을 밝히기가 어렵습니다.

0

@Bean의 자바 독의 "@Bean 방법을 BeanFactoryPostProcessor를 돌려주는"절을 참조하십시오 :

특별 고려 사항은 봄 BeanFactoryPostProcessor를 (BFPP) 형태를 돌려 @Bean 메소드에주의해야합니다. BFPP 객체 은 컨테이너 라이프 사이클의 초기에 인스턴스화되어야하므로 은 @Configuration 클래스에서 @Autowired, @Value, 및 @PostConstruct와 같은 특수 효과 처리를 방해 할 수 있습니다. 이러한 수명주기 문제를 피하려면 BFPP 반환 @Bean 메서드를 정적으로 표시하십시오. 예 :

@Bean 
public static PropertyPlaceholderConfigurer ppc() { 
    // instantiate, configure and return ppc ... 
} 

정적이 방법을 표시함으로써, 따라서 그 선언 @Configuration 클래스의 인스턴스를 일으키는 상기의주기 충돌 방지없이 호출 될 수있다. 그러나 정적 @Bean 메소드는 위에서 언급 한대로 범위 지정 및 AOP 의미에 대해 향상되지 않습니다. 은 일반적으로 다른 @Bean 메소드에 의해 참조되지 않으므로 BFPP의 경우이 방법이 유용합니다. 다시 말해, BeanFactoryPostProcessor에 할당 할 수있는 반환 값 유형을 가진 비 정적 @Bean 메서드 에 대해 WARN 수준의 로그 메시지가 발행됩니다. 즉

PropertiesFactoryBeanPropertySourcesPlaceholderConfigurerstatic로 선언되어 있는지 확인하고 그것을 작동합니다.