2012-12-07 4 views
24

인스턴스화 할 빈의 순서를 지정하는 방법이 있습니까? 즉, 특정 빈이 다른 빈들보다 먼저 인스턴스화되도록하기를 원한다.스프링 3 빈 인스턴스화 시퀀스

스프링 3.2 및 주석 기반 선언 방법을 사용하고 있습니다.

+0

내 연습에서는 인스턴스화 시퀀스가 ​​XML 구성 파일의 순서와 같습니다. 하지만 예외가있을 수 있습니다 .. –

답변

52

다음 순서 <property/>, @Autowired 또는 <constructor-arg/> 정의하여 빈 B에 의존하는 경우는 스프링 컨테이너 강제 고정된다. 여기에 문제 없습니다.

하지만 당신은 명시 적 종속성을 사용 주시기를 통해 표현되지 않은 콩 창조의 특정 순서로 시행 할 경우 :

<bean id="A" depends-on="B"/> 
<bean id="B"/> 

이상 (주석, @Bean 자바 구성으로도 작동) :

@Service 
@DependsOn("B") 
public class A {} 

이상 ... 사용하지 마십시오. 이러한 구조는 코드 냄새이며 종종 구성 요소간에 보이지 않는 종속성이 있음을 제안합니다.

+5

코드 냄새 설명에 대한 +1 – ElderMael

3

빈의 정렬 된 인터페이스를 사용하여 다른 빈에 대한 순서를 정의 할 수 있습니다.

5

Tomasz가 제공 한 답변에 동의합니다. 만약 콩 A가 콩 B에 의존한다는 것을 안다면, 이것은 올바른 접근법입니다.

때때로 모든 bean 인스턴스화 전에 실행되어야하는 논리가 있습니다. 이 경우 BeanFactoryPostProcessor을 사용할 수 있습니다. Spring은 처음에는 BeanFactoryPostProcessors를 생성하고 실행한다. 동시에 BeanFactoryPostProcessor가 일부 bean A에 종속되면 특성 또는 생성자 주입을 사용할 수 있습니다. 이 경우 Spring은 먼저 BeanFactoryPostProcessor를 호출하고 BeanFactoryPostProcessor를 호출하고 그 후에 BeanFactoryPostProcessor를 호출하면 컨텍스트에서 다른 모든 Bean을 시작한다.

+0

시스템 속성 파일에서 spring.active.profile 설정을 설정하는 데이 방법을 사용했습니다. 위대한 작품! –