首页 > 解决方案 > Spring Boot——不同bean实现的自动装配接口

问题描述

我有多个带有@Component 实现通用接口的bean。

我有一堂课,我在其中使用这些 bean 中的方法。我没有单独自动装配每个 bean,而是想办法将接口自动装配为一个列表。

但是当我只是自动装配接口时,如何调用不同bean的方法。

public interface Generic {
}

@Component
public class A implements Generic{
.....
public void test{
}

}

@Component
public class B implements Generic{
.....
public void read{}

}


@component class C {

@Autowired
List <Generic> mylist;  // type of list is Generic

现在我需要从 B 访问读取并从 A 测试

标签: springlistspring-bootinterfaceautowired

解决方案


对于您的新问题,您可以这样做,但我认为最好使用 2 个单独的列表而不是 instanceOf。

public interface Generic { }

public interface GenericTestable extends Generic { 
    void test()
}

public interface GenericReader extends Generic { 
    void read()
}

@Component
public class A implements GenericTestable { 
   public void test() { }
}

@Component
public class B implements GenericReader { 
   public void read() { } 
}

@Component
public class C {

   private final List<Generic> genericItems;

   @Autowired
   public C(List<Generic> genericItems) {
       this.genericItems = genericItems;
   }

   public void callThem() {
       this.genericItems.forEach(this::callMethodOnSpecificType);
   }

   private void callMethodOnSpecificType(Generic genericItem) {
       if (genericItem instanceof GenericTestable) {
           ((GenericTestable) genericItem).test();
       } else if (genericItem instanceof GenericReader) {
           ((GenericReader) genericItem).read();
       }
   }
}

但我认为这样的方法是更好的方法。更干净,更快的代码。删除 Generic 接口并仅使用 2 个单独的接口。

public class BetterC {

    private final List<GenericTestable> genericTestables;
    private final List<GenericReader> genericReaders;

    @Autowired
    public BetterC(List<GenericTestable> genericTestables, List<GenericReader> genericReaders) {
        this.genericTestables = genericTestables;
        this.genericReaders = genericReaders;
    }

    public void callTestables() {
        this.genericTestables.forEach(GenericTestable::test);
    }

    public void callReaders() {
        this.genericReaders.forEach(GenericReader::read);
    }
}

推荐阅读