使用参数args编写JavaConfig bean间依赖关系

时间:2016-02-29 14:47:14

标签: java spring dependency-injection

我正在尝试在配置类中编写这两个bean:

@Bean
public Foo2 foo2() {
    return new Foo2(foo1("test"));
}

@Bean
public Foo1 foo1(String name) {
    return new Foo1(name);
}

但是我在name下得到一个错误标记Could not autowire. No beans of String type found.任何想法如何正确连接这些bean?

1 个答案:

答案 0 :(得分:2)

Spring需要知道whare才能从中获取name属性。您可以使用@Value注释。

名称为"名称"

@Value("Name")

带有从属性文件加载的值的名称

@Value("${name.property}")

带有从属性文件加载的值的名称或默认值为"名称"找不到财产。

@Value("${name.property:Name}")

完整的解决方案是:

@Bean
public Foo2 foo2(Foo1 foo1) {
    return new Foo2(foo1);
}

@Bean
public Foo1 foo1(@Value("${name.property:test}") final String name) {
    return new Foo1(name);
}

<强>更新

如果您想要具有不同名称属性的bean的多个实例,则需要使用@Qualifier创建多个方法并自动装配:

@Bean
public Foo2 bar2(@Qualifier("bar1") Foo1 bar1) {
    return new Foo2(bar1);
}

@Bean
public Foo2 foo2(@Qualifier("foo1") Foo1 foo1) {
    return new Foo2(foo1);
}

@Bean
public Foo1 foo1(@Value("test foo1") final String name) {
    return new Foo1(name);
}

@Bean
public Foo1 bar1(@Value("test bar1")  final String name) {
    return new Foo1(name);
}

如果您没有将每个Foo1实例用作需要注入多个位置的单例,则无需使用spring管理它。如果是这种情况,那么您可以删除@Bean注释:

@Bean
public Foo2 foo2() {
    return new Foo2(foo1("test"));
}

@Bean
public Foo2 bar2() {
    return new Foo2(foo1("test bar2"));
}

public Foo1 foo1(final String name) {
    return new Foo1(name);
}