java - 使用参数args编写JavaConfig bean间依赖

标签 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 下收到一个错误标记,提示 无法 Autowiring 。找不到 String 类型的 beans。知道如何正确连接这些 beans 吗?

最佳答案

Spring 需要知道从哪里获取 name 属性。您可以使用@Value注释。

值为“Name”的名称

@Value("Name")

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

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

具有从属性文件加载的值的名称或默认值“Name”表示未找到属性。

@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 Autowiring :

@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 实例用作需要注入(inject)到多个位置的单例,则无需使用 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);
}

关于java - 使用参数args编写JavaConfig bean间依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35702475/

相关文章:

JAVA - 尝试使面板在框架中可见

java - 当 portlet 不存在时 Liferay 提醒用户

java - 在数值数组和 SimpleITK Image 对象之间传输

c++ - 从类或独立函数指向函数的函数指针

java - 在 JFreechart 中使用多个渲染器

spring - 您可以在 Spring(Boot)之外使用(任何)Spring 的功能吗?

java - Spring Reactor 线程模型

java - SpringMVC、c3p0、hibernate、JPA 应用程序泄漏连接导致 Too Many Connections 错误

dependency-injection - Ninject 3.0.0 基于约定的依赖注入(inject)

java - 我可以将参数传递给 GWT 模块构造函数吗?