自动装配未管理的豆附加说明与@成分
-
05-07-2019 - |
题
我想用@自动连接注入一种非管理豆配置@组成一个管理豆。我很确定我有配对的,但由于某些原因我不断收到的情况例外:
No unique bean of type [foo.Baz] is defined: Unsatisfied dependency of type [class foo.Baz]: expected at least 1 matching bean
基于该错误,我猜这是不够找到Baz类,但是我不知道为什么。这是我的了解,背景:弹配置元件在XML配置应该让我来做到这一点。我还确信包括适当的罐子文件(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 {
...
}
有什么东西是我的失踪?
编辑:该记录列出的豆子它的实例,并foo。Baz不是他们中的一个。我不知道为什么它不捡@成分附加说明的类。
解决方案
由于Bar配置了xml,因此只能使用xml进行配置。即你不能混合它们。因此,“@ Autowired”关于Baz的注释没有被提取(没有注释)。只有在类级别添加spring注释时,spring才会侦听任何其他注释。
您需要做的是在xml中配置要按类型自动装配的bean,为该类型添加一个setter,您将实现所需的行为。
<bean id="bar" class="foo.Bar" autowire="byType"/>
还有一件事,当您使用@Component注释bean时, 是一个Spring托管bean。仅仅因为它不是用xml创建的,并不意味着它是不受管理的。一个非托管的bean是你从春天得不到的。
Bar和Baz都是春季管理。这是你选择定义不同的机制。
其他提示
上次答复是不正确的,在一个方面。你可以自动装配豆是无配置xml。
从部分3.4.5在 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html:
当使用基于XML结构的元数据的[2],指定自动装配模式,对于bean定义与自动装配属性的要件。自动装配的功能有五种模式。你指定的自动装配每豆和因此可以选择哪些自动装配.
你可以自动装配的名称、类型和构造。有一个粗这样的例子: http://www.java2s.com/Code/Java/Spring/AutoWiring.htm
错误是由XML配置文件中定义的bean序列引起的。
与XML文件一样,首先创建 bar
的bean,然后创建其依赖bean,因为 @Autowired
无法找到 baz 代码>
您必须首先为 baz
声明bean,然后为 bar
声明。