如何扫描所有特定类型的@Bean或@Component



我正在玩Spring引导,并试图创建一个库。

作为其中的一部分,我有一个接口。

interface Dummy {
    String doSomething(String input);
}

可能有多种实现。

public class DummyImplA implements Dummy {}
public class DummyImplB implements Dummy {}
public class DummyImplC implements Dummy {}

我想查找作为Beans @Bean@Component公开的所有实现并在应用程序启动时自动调用doSomething方法。

spring是否提供了扫描特定类型的bean的选项?

如果我理解您的问题,您希望获得特定类型的所有bean。有很多方法可以做到这一点。

选项1:自动连接弹簧组件中的假人列表

@Component
public class SpringComponent {
  private List<Dummy> listDummy;
  public  SpringComponent (List<Dummy> list) {
   listDummy = list;
  }      
  //In a method, iterate on listDummy and call doSomething method.
  public void callDoSomething() {
     for(Dummy d : listDummy) {
        d.doSomething();
     }
  }
}

选项2:自动连线弹簧组件中的假人映射

@Component
public class SpringComponent {
    private final Map<String, Dummy> mapDummies;
    public SpringComponent(Map<String, Dummy> mapD) {
        mapDummies = mapD;
    }
    public void callDoSomething() {
        for (Map.Entry<String, Dummy> entry : mapDummies.entrySet()) {
            entry.getValue().doSomething();
        }
    }
}

选项3:自动连接applicationContext并从中获取Dummy类型的所有bean有几种方法可以获取或自动连接applicationContext。

@Component
public class SpringComponent {
    ConfigurableApplicationContext applicationContext;
    public SpringComponent(ConfigurableApplicationContext ac) {
        applicationContext = ac;
    }
    public void getBeanOfDummy() {
          Map <String, Dummy> mapDummies = applicationContext.getBeansOfType(Dummy.class);
        for (Map.Entry<String, Dummy> entry : mapDummies.entrySet()) {
            entry.getValue().doSomething();
        }
    }
}

最新更新