2017-12-04 6 views
0

Java 구성을 사용하면 구성 파일 내에서 bean 작성을 관리 할 수 ​​있습니다. @Component 주석이 달린 컴포넌트 검색과 함께 사용되는 @Service 클래스도 동일합니다. 그러나, 나는이 두 메커니즘을 동시에 사용하는 것에 대해 우려하고 있습니다.Java 구성 대 구성 요소 스캔 주석

같은 프로젝트에서 Java 구성과 주석이 달린 구성 요소 검사를 피해야합니까? 나는 결과가 다음 시나리오에서 불분명하기 때문에 질문 :

@Configuration 
public class MyConfig { 
    @Bean 
    public Foo foo() { 
     return new Foo(500); 
    } 
} 

... 

@Component 
public class Foo { 
    private int value; 

    public Foo() { 
    } 
    public Foo(int value) { 
     this.value = value; 
    } 
} 

... 

public class Consumer { 
    @Autowired 
    Foo foo; 

    ... 
} 

그래서, 위의 상황에서, 소비자는 500 값 또는 0 값으로 푸 인스턴스를받을 수 있습니까? 로컬에서 테스트했는데 Java 구성 Foo (값 500 포함)가 일관되게 생성 된 것으로 보입니다. 그러나, 나는 나의 테스트가 결론적 일만큼 철저하지 않다는 것에 우려하고있다.

실제 답변은 무엇입니까? Java 구성 구성 요소를 모두 사용하면 동일한 유형의 @Component Bean에서 검색하는 것이 좋지 않은 것처럼 보입니다.

+0

나는 구성 요소 검사 때문에 Java 구성이 _only_ 존재한다고 자세히 말하고 싶습니다. 그렇지 않으면 XML이 더 간결합니다. (추신 : 나는 여기서 구성 요소 스캔을 정당화하지 않는다.) –

답변

0

동일한 프로젝트에서 Java 구성 및 주석 구성 요소 검사가 다른 용도로 사용되기 때문에 완벽하게 유효합니다.

@Component (@Service,@Repository 등)은 bean 자동 검색 및 자동 구성에 사용됩니다.

@Bean 주석은 단일 Bean을 명시 적으로 선언하는 데 사용됩니다. 단, Spring은이를 자동으로 수행하지 않습니다.

@Bean으로 다음을 수행 할 수 있습니다. 그러나,이 @Component

@Bean 
public MyService myService(boolean someCondition) { 
    if(someCondition) { 
     return new MyServiceImpl1(); 
    }else{ 
     return new MyServiceImpl2(); 
    } 
} 

불가능은 정말 같은 종류의 콩에 자바 설정 및 구성 요소 검사가 모두 필요했다 상황에 직면하지 않았습니다. spring documentation 당으로

,

단순히 @Bean 어노테이션 방법을 주석, 빈을 선언합니다. JavaConfig가 이러한 메소드를 발견하면 메소드 을 실행하고 반환 값을 BeanFactory 내에 bean으로 등록합니다. 기본적으로 bean 이름은 메소드 이름과 같을 것입니다.

이렇게하면 정확한 Foo (값 500)가 리턴됩니다.

+0

고대 문서에 링크 된 것을 알고 계십니까? – rainerfrey

1

일반적으로 동일한 응용 프로그램 컨텍스트에서 구성 요소 검색 및 명시 적 bean 정의에는 아무런 문제가 없습니다. 가능한 경우 구성 요소 검색을 사용하는 경향이 있으며 @Bean 메서드를 사용하여 더 많은 설정이 필요한 몇 개의 빈을 만듭니다.

유형의 Bean을 명시 적으로 작성할 때 구성 요소 스캔에 클래스를 포함 할 수있는 장점이 없습니다. 구성 요소 검색은 특정 클래스 및 패키지를 쉽게 대상으로 할 수 있습니다. 이에 따라 패키지를 설계하면 구성 요소가 "특수"bean 클래스없이 패키지 만 스캔 할 수 있습니다. 그렇지 않으면 스캔시 고급 필터를 사용합니다.

간략히 살펴보면이 경우 bean 정의 우선 순위에 대한 명확한 정보를 찾지 못했습니다.전형적으로 이것들이 처리되는 결정 론적이고 상당히 안정적인 순서가 있지만 문서화되어 있지 않다면 어쩌면 일 수 있습니다.