@Component로 주석이 달린 관리되지 않은 콩을 자동화합니다
-
05-07-2019 - |
문제
@autowired를 사용하여 @Component로 구성된 비 관리 Bean을 관리되는 Bean에 주입하고 싶습니다. 나는 구성이 올바르게 있다고 확신하지만 어떤 이유로 든 예외를 계속 얻습니다.
No unique bean of type [foo.Baz] is defined: Unsatisfied dependency of type [class foo.Baz]: expected at least 1 matching bean
오류를 바탕으로 BAZ 클래스를 찾을 수 없다고 생각하지만 그 이유는 확실하지 않습니다. XML 구성의 컨텍스트 : 스프링 구성 요소 가이 작업을 수행 할 수있게되었음을 이해합니다. 또한 적절한 JAR 파일 (spring-weaving.jar 및 sagneweaver.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 {
...
}
내가 놓친 것이 있습니까?
편집하다: 로그에는 콩이 인스턴스화하는 콩을 나열하고 foo.baz는 그 중 하나가 아닙니다. 왜 @Component 주석에 주석이없는 클래스를 집어 들지 않는지 모르겠습니다.
해결책
Bar는 XML로 구성되므로 XML로만 구성 할 수 있습니다. 즉, 당신은 그들을 혼합 할 수 없습니다. BAZ에 대한 "@autowired"주석이 픽업되지 않도록합니다 (주석 중 어느 것도 없음). 스프링이 다른 주석을들을 수있는 클래스 레벨에서 스프링 주석을 추가 할 때만 가능합니다.
당신이해야 할 일은 XML에서 콩을 유형별로 자동화하도록 구성하고 해당 유형의 세터를 추가하면 원하는 동작을 달성하는 것입니다.
<bean id="bar" class="foo.Bar" autowire="byType"/>
한 가지 더, @component와 콩에 주석을 달 때 ~이다 봄 관리 콩. XML로 생성되지 않았다고해서 관리되지 않는다는 의미는 아닙니다. 관리되지 않는 콩은 봄부터 얻지 못하는 콩입니다.
Bar와 Baz는 모두 봄 관리됩니다. 다른 것을 정의하기 위해 선택한 메커니즘입니다.
다른 팁
한 측면에서 이전 응답은 정확하지 않습니다. XML로 구성된 Autowire Bean을 사용할 수 있습니다.
섹션 3.4.5에서 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html:
XML 기반 구성 메타 데이터 [2]를 사용하는 경우 요소의 Autowire 속성으로 Bean 정의에 대한 Autowire 모드를 지정합니다. Autowiring 기능에는 5 가지 모드가 있습니다. 콩 당 자동화를 지정하므로 Autowire에 어떤 것을 선택할 수 있습니다.
이름, 유형 및 생성자로 자동 로이어를 사용할 수 있습니다. 여기에는 조잡한 예가 있습니다. http://www.java2s.com/code/java/spring/autowiring.htm
오류는 XML 구성 파일에 정의 된 Bean 시퀀스 때문입니다.
XML 파일에서와 같이 Bean bar
먼저 생성 된 다음 의존 콩으로 인해 @Autowired
찾을 수 없습니다 baz
.
먼저 Bean을 선언해야합니다 baz
그리고 와서 bar
.