考虑以下代码
public interface Iface1 { }
public interface Iface2 { }
public class A implements Iface1, Iface2 {
}
@Configuration
public class AutoConfig {
@Bean
Iface1 provideIface1Impl() {
return new A(); // instance no 1234
}
@Bean
@ConditionalOnBean(A.class)
@Autowired
Iface2 provideIface2Impl(A aImpl) {
return aImpl;
}
}
我希望第二个@Bean
方法与第一个(1234)中的实例一起自动装配,并且我希望第二个@Bean
方法返回相同的实例,以便我可以为Iface1
和Iface2
的客户使用相同的实例。
目前的问题是Spring没有运行第二个@Bean
,因为@Bean
类型没有A.class
- 创建的bean甚至被视为Iface1
虽然它的类型为A
。
答案 0 :(得分:2)
只需定义bean A.当注入IFace1和Iface2时,它们将自动解析为A(如果A是当然唯一的实现)。
@Bean
public A a() {
return new A();
}
答案 1 :(得分:0)
我认为你应该尝试只定义一个@Bean
。它将创建一个单身人士:
@Bean
public A a() {
return new A();
}
然后在@Qualifier
注释中使用此bean的名称:
@Autowired
@Qualifier("a")
private Iface1 iface1;
@Autowired
@Qualifier("a")
private Iface2 iface2;
答案 2 :(得分:0)
除了其他人的回答之外,我还想介绍触及bean依赖的那部分问题。
要为@Bean
- 注释方法注入依赖关系,有两种方法:
两者的例子:
@Configuration
public class AppConfig {
@Bean
public Foo foo() {
return new Foo();
}
@Bean
public Bar bar() {
return new Bar(foo());
}
@Bean
public Baz baz(Foo foo) {
return new Baz(foo);
}
}
所以你的provideIface2Impl看起来像这样:
@Bean
Iface2 provideIface2Impl(A aImpl) {
return aImpl;
}
// or...
@Bean
Iface2 provideIface2Impl() {
return (Iface2)provideIface1Impl();
}
但是不要这样使用它,它会导致像双重代理这样的微妙错误或者#34;没有类型的独特bean#34;错误等。首选Gorazd建议。