7

我想使用@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 配置中的 context:spring-configured 元素应该允许我这样做。我还确保包含适当的 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>

我有一个托管 bean:

package foo;

public class Bar {

    @Autowired
    private Baz baz;

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

    ...
}

还有一个非托管 bean:

package foo;

@Component
public class Baz {
    ...
}

有什么我想念的吗?

编辑:日志列出了它实例化的 bean,而 foo.Baz 不是其中之一。我不知道为什么它没有选择 @Component 注释类。

4

3 回答 3

11

因为Bar是用xml配置的,所以只能用xml配置。即你不能混合它们。因此,Baz 上的“@Autowired”注释不会被拾取(没有任何注释)。只有当您在类级别添加 spring 注释时,spring 才会侦听任何其他注释。

您需要做的是在 xml 中将 bean 配置为按类型自动装配,为该类型添加一个设置器,您将实现所需的行为。

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

还有一件事,当你用 @Component 注释一个 bean 时,它一个 spring 管理的 bean。仅仅因为它不是用 xml 创建的,并不意味着它是不受管理的。非托管 bean 是你从春天得不到的。

Bar 和 Baz 都是春季管理的。不同的是您选择定义它们的机制。

于 2009-06-17T16:35:06.923 回答
6

一方面,之前的回答是不正确的。您可以自动装配以其他方式使用 xml 配置的 bean。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html中的第 3.4.5 节:

当使用基于 XML 的配置元数据[2] 时,您可以使用元素的 autowire 属性为 bean 定义指定 autowire 模式。自动装配功能有五种模式。您指定每个 bean 的自动装配,因此可以选择要自动装配的那些。

您可以按名称、类型和构造函数自动装配。这里有一个粗略的例子:http ://www.java2s.com/Code/Java/Spring/Au​​toWiring.htm

于 2010-10-25T14:41:39.683 回答
-2

该错误是由于 XML 配置文件中定义的 bean 序列造成的。

与您的 XML 文件一样,bar首先创建 bean for,然后创建它们的依赖 bean,因此@Autowired无法找到baz.

您必须先声明 bean for baz,然后再声明 for bar

于 2012-05-21T13:53:23.357 回答