11

좀 혼란스러운 부분을 발견 봄 Javaconfig 참조 문서 http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/beans.html 찾아보기 ... "를 @Configuration 어노테이션을 사용 5.12.4"섹션 에서봄 Javaconfig 간 콩 의존성

는 말한다 :

,745,151 : @Beans 서로에 종속되면

"는 그 의존성을 표현하는 한 방법은 콩은 다른 전화 갖는 것처럼 간단

@Configuration public class AppConfig { @Bean public Foo foo() { return new Foo(bar()); } @Bean public Bar bar() { return new Bar(); } } 

위 예제에서 foo bean은 생성자 삽입을 통해 bar에 대한 참조를 수신합니다. "

는 는

음, 모든 비 상태 인 경우, 그 수도는 문제가 많은,하지만 당신은 응용 프로그램에서 다음 위의 설정을 가지고 있고,하지 :

@Autowired 
private Foo foo; 

@Autowired 
private Bar bar; 

콩의 해시 코드를 확인, 그것은 밝혀 , 개인 변수 잘, 당신은 무엇을 기대 아마도하지 않은 foo는, 에서 사용하는 것보다 다른 인스턴스 에 바를 참조 할 것?

나는 정상적인 패턴이 아니라해야한다 말할 것이다 : 앱에서 모두 콩을 autowire하기 때, 당신은 단지 바의 단일 인스턴스를 생성합니다

이제
@Configuration 
public class AppConfig { 
    @Bean 
    public Bar bar() { 
     return new Bar(); 
    } 
    @Autowired Bar bar; 
    @Bean 
    public Foo foo() { 
     return new Foo(bar); 
    } 
} 

.

내가 누락 되었습니까? 아니면 설명서가 여기에 부스러기가 맞습니까? 지금

@Configuration 
public class AppConfig { 
    @Bean 
    public ClientService clientService1() { 
     ClientServiceImpl clientService = new ClientServiceImpl(); 
     clientService.setClientDao(clientDao()); 
     return clientService; 
    } 
    @Bean 
    public ClientService clientService2() { 
     ClientServiceImpl clientService = new ClientServiceImpl(); 
     clientService.setClientDao(clientDao()); 
     return clientService; 
    } 
    @Bean 
    public ClientDao clientDao() { 
     return new ClientDaoImpl(); 
    } 
} 

:

그런 다음, 더 아래 섹션 에서 그들이이 문제를 "명확히"하려고처럼 보이는 "어떻게 자바 기반의 구성에 대한 자세한 내용은 내부적으로 작동합니다" 불행하게도이 구성은 런타임시로드되지 않습니다. 동일한 유형의 빈인 ClientService가 고유 한 특성이 없기 때문에 예외가 발생하므로 예외 발생

org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type [.....] is defined: 
expected single matching bean but found 2 

그러나 우리는 약간의 예를 변경하고 처음 2 콩에게 다른 유형을 제공하는 경우에도,

@Bean 
public ClientService1 clientService1() {...clientDao()...} 
@Bean 
public ClientService2 clientService2() {...clientDao()...} 
@Bean 
public ClientDao clientDao() { 
    return new ClientDaoImpl(); 
} 

이 있기 때문에, 여전히 올바르지 않습니다 - 어떤 텍스트 주장과는 달리 - 우리는 여전히 다른 3를 만들 것 ClientDaoImpl의 인스턴스 인 은 3 개의 모든 빈을 자동으로 호출합니다.

다시 한 번 뭔가 누락되었거나 실제로 나쁘게 보일만한 문서입니까?

편집 : 추가 데모 내가 보는 문제 보여줄 것입니다 :

https://github.com/rop49/demo

ServiceA, 두 콩 ServiceB1, ServiceB2이 생성자를 분사을 서비스 A.

두 개의 테스트 클래스 구성을 제외하고 동일 Config01Test와 Config02Test. 첫 번째 테스트는 PASSES, 두 번째 FAILS는 고유성 때문에 발생합니다.

+3

왜 당신이 다른'Bar' 객체를 얻을 수 있습니다 생각하십니까 전체 응용 프로그램 컨텍스트에서 줄 하나의 인스턴스 만이 있는지 확인해야합니까? – chrylis

+0

작은 테스트를하고 빈에서 hashCodes를 확인하십시오. 그들은 다르다. 나는 위의 질문에 이것을 분명히했다, 고마워. – Rop

+0

Spring Boot를 사용하여 GitHub에서 간단한 예제를 게시 할 수 있습니다. 나는이 행동을 한 번도 본 적이 없으며, 실제로 일어난다면 벌레입니다. – chrylis

답변

8

구성 클래스에 @Configuration 개의 주석이 있는지 확인하십시오. 데모를 사용하여 최소한 Config01Config02 클래스에서 빠져 있습니다. 내가 그 수업에 추가하면 시험이 통과됩니다. 나는 예를 나 자신을 테스트하지했습니다

+0

아아, 멋지게 정리 했어. :) Phil! – Rop

+0

부울 ... \ @Configuration 주석이없는 클래스의 Spring reject \ @SpringApplicationConfiguration을 갖는 것이 합리적일까요? 아니면 이것을 허용하는 올바른 유스 케이스가 될 것입니까? – Rop

+1

불행히도 다시 호환성을 깨뜨릴 것입니다. 여기에 라이트 콩 섹션을 참조하십시오. http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/htmlsingle/#beans-java-basic-concepts –

0

, 이것은 당신이

@Configuration 
public class AppConfig { 
    @Bean 
    public Foo foo(Bar bar) { 
     return new Foo(bar); 
    } 
    @Bean 
    public Bar bar() { 
     return new Bar(); 
    } 
}