2009-06-16 6 views
7

@AutoWired를 사용하여 @Component로 구성된 비 관리 빈을 관리 빈에 삽입하고 싶습니다. 내가 구성 할 수있는 권한을 갖습니다 확신하지만, 어떤 이유로 나는 예외가 계속 : 오류를 바탕으로@Component 주석이 달린 관리되지 않는 빈을 자동으로 호출

No unique bean of type [foo.Baz] is defined: Unsatisfied dependency of type [class foo.Baz]: expected at least 1 matching bean 

을, 나는 그것이 바즈 클래스를 찾을 수 없습니다 같은데요,하지만 난 왜 그런지 모르겠다. 컨텍스트 : XML 구성의 스프링 구성 요소가이 작업을 수행 할 수 있도록되어 있다고 생각합니다. 적절한 jar 파일 (spring-weaving.jar 및 aspectjweaver.jar)도 포함 시켰습니다.

다음은 간단한 설정 예입니다.

내 XML의 설정 :
<beans ...> 
    ... 

    <context:annotation-config/> 
    <context:spring-configured/> 
    <context:component-scan base-package="foo"/> 

    <bean id="bar" class="foo.Bar"/> 
    ... 
</beans> 

나는 하나의 관리 빈

을했다 :

package foo; 

public class Bar { 

    @Autowired 
    private Baz baz; 

    public void setBaz(Baz baz) { 
     this.baz = baz; 
    } 

    ... 
} 

그리고 하나의 관리되지 않는 콩 : 내가

package foo; 

@Component 
public class Baz { 
    ... 
} 

뭔가가 거기를 누락?

EDIT : 로그에 빈 인스턴스가 나열되고 foo.Baz는 그 중 하나가 아닙니다. 왜 그것이 @Component 주석이 달린 클래스를 선택하지 않는지 나는 모른다.

+0

로깅은 무엇을 말합니까? 그것은 foo 패키지의 빈을 자동으로 감지한다는 것을 언급합니까? 디버그 로깅에서 어떤 @Component Bean이 발견되었는지 밝혀야합니다. – skaffman

+0

덧붙여서 aspectj/weaving/spring-configured stuff는 당신이하고 싶은 일에 반드시 필요한 것은 아닙니다. 이것은 단지 기본적인 autowiring 일뿐입니다. – skaffman

답변

11

막대가 xml로 구성되었으므로 xml로만 구성 할 수 있습니다. 즉, 이들을 혼합 할 수는 없습니다. 따라서 Baz의 "@Autowired"주석은 선택되지 않습니다 (주석이 없음). 클래스 수준에서 봄 특수 효과를 추가 할 때만 봄이 다른 특수 효과를 모두 듣게됩니다.

당신이해야 할 일은 xml에서 bean이 유형에 따라 autowired되도록 설정하고, 그 유형에 대한 setter를 추가하면 원하는 동작을 얻을 수 있습니다. 당신이 @Component와 콩을 주석 때

<bean id="bar" class="foo.Bar" autowire="byType"/> 

한가지 더, 그것은 는 스프링이 빈을 관리입니다. XML로 생성되지 않았다고해서 그것이 관리되지 않는다는 것을 의미하지는 않습니다. 관리되지 않는 콩은 봄에 얻지 못하는 콩입니다.

바 및 바스는 모두 스프링 관리됩니다. 다른 메커니즘을 정의하기 위해 선택한 메커니즘입니다.

+0

내 용어의 오해. 좋은 대답. 감사! –

+3

xml과 주석 구성을 혼합 할 수 있습니다. – banterCZ

+0

@banterCZ 예 ... 이제 알았습니다 –

6

이전 응답이 한 측면에서 올바르지 않습니다. 그렇지 않으면 xml으로 구성된 bean을 autowire 할 수 있습니다. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html 섹션 3.4.5에서

:

XML 기반의 설정 메타 데이터 [2]을 사용하여, 당신은 요소의 자동으로 묶어 속성이 빈 정의에 대한 자동으로 묶어 모드를 지정합니다. autowiring 기능에는 다섯 가지 모드가 있습니다. 빈마다 autowiring을 지정하면 자동 줄 바꿈을 선택할 수 있습니다.

이름, 유형 및 생성자별로 자동 배선 할 수 있습니다. 이것에 대한 예는 다음과 같습니다. http://www.java2s.com/Code/Java/Spring/AutoWiring.htm

-2

오류는 XML 구성 파일에 정의 된 빈의 시퀀스로 인한 것입니다.XML 파일에로

bar을위한 콩은 @Autowiredbaz을 찾을 수 없습니다 때문에되는 그들의 의존 콩을 처음 생성된다.

먼저 baz에 대해 bean을 선언 한 다음 bar에 대해 bean을 선언해야합니다.

+0

xml 구성에서 모든 bean을 어디에서나 선언 할 수 있지만 순서는 관련이 없습니다. –