问题:
我正在与其他团队编写的图书馆进行整合。这个库提供了一组我在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。),并且该软件包中的某些类对我的应用程序来说是无用的,并且太昂贵而且不必要地创建。此外,我不使用的某些课程是实验性的,可以在不事先通知的情况下进行更改/重命名/删除。
答案 0 :(得分:2)
添加autowire="constructor"
,假设这些bean类型只有一个构造函数,并且相应的参数与单个bean匹配。
<bean class="lib.Service1" autowire="constructor"/>
来自文档
- 醇>
"constructor"
类似于构造函数参数的
"byType"
。如果有 并不是一个构造函数参数类型的bean bean工厂,引发致命错误。请注意,明确 依赖关系,即"property"
和"constructor-arg"
元素 覆盖自动装配。注意:此属性不会被继承 子bean定义。因此,需要根据具体情况进行说明 bean定义。