【发布时间】:2016-06-13 12:20:50
【问题描述】:
假设我有一个通过组件扫描初始化的服务 bean:
@Service
public class MyService { ... }
我在我的 Java 应用程序配置中配置了一个 bean A,它依赖于也在 Java 配置中定义的另一个 bean B,而后者又依赖于使用构造函数注入的 Service。我可以在 A 的 bean 工厂中使用自动装配并将其传递给 B:
@Bean
@Autowired
public A a(MyService service) {
return new A(b(service));
}
@Bean
public B b(MyService service) {
return new B(service);
}
但是,这对我来说不是很干净。 a() 不应该关心 MyService。但如果我要调用new B(service),我需要以某种方式将服务放入b(),如果这是一个方法参数,a() 需要在其中放一些东西。
我试过了:
@Autowired private MyService service;
@Autowired
public A a() {
return new A(b());
}
@Bean
public B b() {
return new B(service);
}
但这会将null 注入new B(...) - 显然Spring 在调用b() 后填充了该字段。
我也试过了:
public B b() {
return new B(context.getBean(MyService.class));
}
...这会产生一个与循环引用相关的BeanInstantiationException。
我怎样才能让MyService bean 直接进入b() 的new B(...)?
更新:以上是对我实际想要做的事情的简化。
真实情况是我有一堆Action bean,它们使用共享的DataService bean 来访问数据。然后我有一个CompositeAction 类,它包含对几个Action 对象的引用,并根据运行时标准调用适当的对象。
我想配置两个CompositeAction 类型的bean,每个bean 都有自己手动配置的一组委托Action bean。但我希望 Action bean 通过构造函数注入与 DataService 自动装配。
CompositeAction ----> Action ---\
| \
\-----> Action ---\ \
----> DataService
CompositeAction ----> Action ---/ /
| /
\------> Action ---/
【问题讨论】:
标签: java spring dependency-injection