2

我有一个 spring 项目,其中包含一个 bean 定义文件,该文件包含一个引用另一个 bean 作为属性的 bean,例如

<bean id="aBean" class="org.test.class">
    <property class="org.test.A" autowire="byType"/>
</bean>

此 bean 定义文件将由其他可能包含也可能不包含扩展 org.test.A 的 bean 的 spring 项目导入。

我想做的是,如果存在 org.test.A 的扩展实现(即 org.test.B),我想在属性中引用它,否则只需引用 org.test.A。

我一直在对此事进行一些研究,但尚未得出答案。我尝试编写一个自定义 TypeFilter ,但这似乎只允许我返回 true 或 false 是否应该返回一个类,而不是检查一个类的所有现有 bean 定义并选择一个。

这样的事情可能吗?如果是这样,人们将如何去做呢?

这个想法是避免必须重写一堆相互引用的bean定义(并且在每个项目中大部分都是相同的)并且只编写引用bean的实现。

对此事的任何意见表示赞赏。

----- 更新 1 ------

我已经尝试使用@Primary,但到目前为止还没有运气。没有错误,但使用的类不是带有@Primary 的类。

主类 org.test.A 扩展了另一个类(org.test.Whatever),然后在我的 servlet 上下文中,我有以下内容

<bean id="someID" class="org.someclass">
    <property name="realm" ref="testBean" />
</bean>

然后我创建了另一个 org.test.B 类,它扩展了 org.test.A 并且同时具有 @Component 和 @Primary 但不行。Spring 似乎正在加载该类但没有使用它。

----- 更新 2 -----

好的,我想我知道发生了什么。我正在自动装配的类(我无法控制源代码)恰好有 2 个设置方法,1 个采用单个类,一个采用该类的集合。Spring 似乎认为因为它找到了同一个类的多个 bean,它应该自动装配采用集合的集合,而不是自动装配采用单个实例的集合。

如何在实例化类的上下文 xml 中指定应该自动装配哪个方法?我不明白为什么 spring 不允许我在属性上使用 autowire 属性。我只能在离开弹簧的 bean 上设置自动装配来选择自动装配的方法。:S

4

3 回答 3

6

@Primary注释可能会对您有所帮助。

如果您有超过 1 个实现,则使用带有注释的@Primary那个

于 2013-07-22T13:15:04.737 回答
0

您应该使用spring 工厂方法来实例化这个 bean或者,像本例一样使用查找方法注入。

于 2013-07-22T13:15:18.943 回答
0

这是使用 SpEL 执行此操作的另一种方法 我有两个 DataStrategy 类型的实现,bean ids testDataStrategy 和 realDataStrategy

我可以通过在我的 Java 项目的属性文件中设置属性“data.strategy”来在 bean 之间进行选择。

<bean id="myBeanId" class="com.some.path.MyBeanClass" >
    <property name="dataStrategy" value="#   {'${data.strategy}'.equalsIgnoreCase('TEST_DATA') ? testDataStrategy : realDataStrategy}" />
</bean>
于 2014-07-02T07:46:13.363 回答