繁体   English   中英

使用spring注入多个实现的正确方法

[英]right way to inject multiple implementation using spring

我有一个class A ,其中有一个字段ADep (A的依赖项)。 现在aDep具有两种类型的实现, typeB impls typeA implstypeB impls 我想在使用typeB时抛出特定异常时使用typeA 我正在使用spring进行依赖注入。

我可以想到3种方式:

  1. 我再定义一个字段aDep,并在其上注入任何typeB实现(请参见下面的类)。 问题在于,任何人都可以使用任何typeA实现来初始化该字段,而我对此字段的假设是typeB的行为。
class A {
    ADep aDepI1;//only typeA impls
    ADep aDepI2;//only typeB impls
}
  1. 一个只有一个字段,我使用Spring的bean工厂拿到typeB impl我的类中,如果使用异常时抛出typeA

  2. 我创建了一个利用弹簧的两个实例,一个用typeA和一个与typeB和A的用户必须使用typeA第一,如果一个异常,同时又抛出调用typeB实例。

我认为第三个解决方案是最好的。 您有什么想法,需要任何帮助吗?

在Java 8及更高版本中,您可以执行以下操作

public interface IMyInterface{}

public class ClassA implements IMyInterface{}

public class ClassB implements IMyInterface{}

然后,您可以执行以下操作(请注意,此代码不是复制/粘贴内容,请接受此想法)

public class SomeClient{
    @Autowired List<IMyInterface> myInterfaceImps;

   public IMyInterface obtainImplementation(Some inputData)
   {
    return myInterfaceImps.stream().filter(c->somePredicate(c,inputData))
    .findFirst()
    .orElse(defineHereDefaulBehaviour());
   }

 }

然后使用类似的代码,您可以自动连接SomeClient类以检索所需的imp

另一种方法是通过@Qualifiers和ServiceLocatorFactoryBean使其实现

我只是想补充一下,看起来您就像在使用异常一样的语句,这是一种代码味道。 我要共享的解决方案是关于如何根据谓词函数中定义的某些条件来检索不同的bean,或者如果取决于“某些”,则可以通过ServiceLocator检索bean本身。 根据您的实现方式,我应该工作,但是您的代码应使用ifs异常。

问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM