@Component
class MultiProvider {
public Foo getFoo();
public Bar getBar();
}
@Component
class FooConsumer {
FooConsumer(Foo f);
}
我可以将MultiProvider.getFoo()
自动连接到FooConsumer
构造函数中。.
Foo
本身成为一个bean(例如,因为Spring不应销毁它,因为MultiProvider
的责任)FooConsumer
到MultiProvider
(或任何其他类)的依赖关系?答案 0 :(得分:0)
Spring只能自动连接已声明的bean,可能的解决方法如下所示:
@Component
class FooConsumer {
private final Foo foo;
FooConsumer(MultiProvider multiProvider) {
// MultiProvider will be autowired by spring - constructor injection
this.foo = multiProvider.getFoo();
}
}
答案 1 :(得分:0)
您可以简单地通过用getFoo()
在MultiProvider
中注释@Bean
方法来实现此目的
@Component
class MultiProvider {
@Bean(destroyMethodName="cleanup") // HERE IS THE TRICK
public Foo getFoo();
public Bar getBar();
}
@Component
class FooConsumer {
FooConsumer(Foo f);
}
如果问题出在弹簧无法正确销毁这一点,则可以在cleanup
注释时声明的@Bean
方法内部包含逻辑
public class Foo {
public void cleanup() {
// destruction logic
}
}
请注意,@component和@configurable在以下方面大致相同 一些细微的差异,但如果您不这样做,可以使用@component 要更改它。 More Info
答案 2 :(得分:0)
您可以将它们包含在Configuration
中。
@Configuration
class MyConfig {
@Bean
public MultiProvider getMP() {
return new MultiProvider() ;
}
@Bean
public Foo getFoo() {
return getMP(). getFoo();
}
}
不确定是否违反您的“不是Bean本身”规则。