gpt4 book ai didi

java - Spring DI : Specify default component for FactoryBean

转载 作者:行者123 更新时间:2023-11-29 06:04:45 25 4
gpt4 key购买 nike

我有两个接口(interface) IFoo 的实现: Foo1Foo2 .

我需要上下文才能为任何需要 IFoo 的类注入(inject)正确的上下文该类不知道它将获得什么实现(因此不使用 @Qualifier )。

使用示例:

class Bar { 
@Autowired IFoo foo;
}

我有一个 FactoryBean<IFoo>具有要返回的逻辑的类。

问题是我还想让这两个 impl 通过 IOC,因为它们本身具有依赖性。

public class FooFactory implements FactoryBean<Foo> {
@Autowired Foo1 foo1;
@Autowired Foo2 foo2;

@Override
public IFoo getObject() throws Exception {
if(someLogic()){
return foo1;
}
return foo2;
}
}

如果我将它们自动连接到工厂中,我会得到一个异常(exception)

"No unique bean of type IFoo is defined: expected single matching bean but found 3: [fooFactory, foo1, foo2]"

有什么方法可以告诉 spring 只对其他所有人使用默认的 fooFactory 而使用工厂内部的两个实现?

最佳答案

您可以使用“主要”bean 的概念。假设您正在使用 XML 配置,那么:

<bean id="fooFactory" class="x.y.FooFactory" primary="true"/>

现在,@Autowired IFoo foo 应该选择工厂的结果,优先于 foo1foo2 bean。

我还建议在工厂内部使用@Resource,而不是@Autowired,即

public class FooFactory implements FactoryBean<Foo> {
@Resource Foo1 foo1;
@Resource Foo2 foo2;

这减少了 Autowiring 追逐自己的尾部的机会,因为 @Resource 将注入(inject)一个特定的命名 bean(即 foo1foo2).您仍然会在 Bar 中使用 @Autowired

如果您像那样使用@Resource,那么使用primary="true" 的替代方法是排除foo1foo2 来自 Autowiring 的 bean,例如

<bean id="foo1" class="x.y.Foo1" autowire-candidate="false"/>

关于java - Spring DI : Specify default component for FactoryBean<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8900735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com