如何告诉Spring实例化选定的bean而不提供构造函数args?

时间:2015-02-12 21:46:17

标签: java spring constructor

问题:

我正在与其他团队编写的图书馆进行整合。这个库提供了一组我在Spring驱动的应用程序中使用的类。我的应用程序中的每个bean都在单例范围内。

该库中99%的类都使用构造函数注入。

我使用的是XML,我的配置与以下内容非常相似:

<bean id="lib.service1" class="lib.Service1"/>
<bean id="lib.service2" class="lib.Service2">
 <constructor-arg ref="lib.service1"/>
</bean>
<bean id="lib.service3" class="lib.Service3">
 <constructor-arg ref="lib.service1"/>
</bean>
<bean id="lib.service4" class="lib.Service3">
 <constructor-arg ref="lib.service2"/>
 <constructor-arg ref="lib.service3"/>
</bean>
<!-- other bean definitions -->
<bean id="lib.serviceN" class="lib.ServiceN">
 <constructor-arg ref="lib.serviceX"/>
 <constructor-arg ref="lib.serviceY"/>
 <constructor-arg ref="lib.serviceZ"/>
 <constructor-arg ref="lib.serviceK"/>
</bean>
<!-- other bean definitions -->

我想要的是什么:

我想简化配置,不使用bean ID,并根据bean构造函数中的参数类型请求spring为我做构造函数注入。我还可以要求库实现者将@Inject注释添加到类构造函数中(99%的类只有一个公共构造函数),但这就是我可以要求重构它们的库。

最后我想在我的春季配置中关注一下(没有工作,但说明了这个想法):

<bean class="lib.Service1"/>
<bean class="lib.Service2"/>
<bean class="lib.Service3"/>
<!-- ... -->
<bean class="lib.ServiceN"/>

我希望Spring能够确定我想对所有bean使用构造函数注入,并根据构造函数参数类型推断bean实例。

请注意我不能使用组件扫描 - 它们有一个软件包(上面给出的示例中的lib。),并且该软件包中的某些类对我的应用程序来说是无用的,并且太昂贵而且不必要地创建。此外,我不使用的某些课程是实验性的,可以在不事先通知的情况下进行更改/重命名/删除。

1 个答案:

答案 0 :(得分:2)

添加autowire="constructor",假设这些bean类型只有一个构造函数,并且相应的参数与单个bean匹配。

<bean class="lib.Service1" autowire="constructor"/>

来自文档

  
      
  1. "constructor"
  2.         

    类似于构造函数参数的"byType"。如果有   并不是一个构造函数参数类型的bean   bean工厂,引发致命错误。请注意,明确   依赖关系,即"property""constructor-arg"元素   覆盖自动装配。注意:此属性不会被继承   子bean定义。因此,需要根据具体情况进行说明   bean定义。