【问题标题】:Autowire annotation driven bean into bean specified in Java config with constructor injection使用构造函数注入将注释驱动的 bean 自动装配到 Java 配置中指定的 bean
【发布时间】: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


    【解决方案1】:

    为什么不呢?

    @Bean
    public A a(B b) {
        return new A(b);
    }
    
    @Bean
    public B b(MyService service) {
        return new B(service);
    }
    

    【讨论】:

    • 因为我想显式配置将哪个B 注入a。我不希望它自动连接到 A。
    • 所以您希望为应用程序配置B bean 实例,但为bean A 配置另一个B 实例?如果是这样,那么另一个带有@Qualifier 的 B 定义怎么样?或者也许有一个带有原型范围的基本B 定义并在注入后进一步自定义它?
    • 我在问题中添加了更多关于我想要实现的目标。
    • 我明白了,那么如何将Action bean 原型设为作用域并将其实例自动装配到CompositeAction 中?这样CompositeAction 定义不会处理Action 实例的创建,但仍会得到不同的实例。
    猜你喜欢
    • 2014-06-30
    • 2012-10-25
    • 2013-11-21
    • 2010-11-03
    • 2012-08-03
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2017-03-09
    相关资源
    最近更新 更多