提供可用于注入多个接口的单个@Bean
Provide single @Bean that can be used to inject in multiple interfaces
考虑以下代码
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
方法与 return 相同实例,这样我就可以为 Iface1
和 Iface2
.
的客户端使用相同的实例
当前的问题是 spring 没有 运行 第二个 @Bean
因为没有 @Bean
类型 A.class
- 创建的 bean 是被视为 Iface1
,即使它是 A
.
类型
我认为你应该尝试只定义一个 @Bean
。它将创建一个单例:
@Bean
public A a() {
return new A();
}
然后在@Qualifier
注释中使用这个bean的名称:
@Autowired
@Qualifier("a")
private Iface1 iface1;
@Autowired
@Qualifier("a")
private Iface2 iface2;
只需定义 bean A。当注入 IFace1 和 Iface2 时,它们将自动解析为 A(当然如果 A 是唯一的实现)。
@Bean
public A a() {
return new A();
}
除了其他人已经回答的内容之外,我还想涵盖涉及 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();
}
但不要这样使用,会导致双重代理或"No unique bean of type"错误等细微错误。更喜欢建议。
考虑以下代码
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
方法与 return 相同实例,这样我就可以为 Iface1
和 Iface2
.
当前的问题是 spring 没有 运行 第二个 @Bean
因为没有 @Bean
类型 A.class
- 创建的 bean 是被视为 Iface1
,即使它是 A
.
我认为你应该尝试只定义一个 @Bean
。它将创建一个单例:
@Bean
public A a() {
return new A();
}
然后在@Qualifier
注释中使用这个bean的名称:
@Autowired
@Qualifier("a")
private Iface1 iface1;
@Autowired
@Qualifier("a")
private Iface2 iface2;
只需定义 bean A。当注入 IFace1 和 Iface2 时,它们将自动解析为 A(当然如果 A 是唯一的实现)。
@Bean
public A a() {
return new A();
}
除了其他人已经回答的内容之外,我还想涵盖涉及 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();
}
但不要这样使用,会导致双重代理或"No unique bean of type"错误等细微错误。更喜欢