Java 获取给定类型的SpringBean的最佳实践

Java 获取给定类型的SpringBean的最佳实践,java,spring,Java,Spring,我在多个stackoverflow问题上读到,applicationContext.getbean是个坏主意 我想知道是否有更好的方法在spring中扫描给定类型的bean 我的用例是在spring启动期间获取给定类型的bean,并在这些bean上调用一些方法 据我所知,只有两种方法可以做到这一点 将应用程序上下文自动连接到Springbean中,并使用appContext.getBeansOfType 钩住后处理器并通过 if(类型的bean实例) 我觉得挂上后处理器只是为了处理一种类型的b

我在多个stackoverflow问题上读到,applicationContext.getbean是个坏主意

我想知道是否有更好的方法在spring中扫描给定类型的bean

我的用例是在spring启动期间获取给定类型的bean,并在这些bean上调用一些方法

据我所知,只有两种方法可以做到这一点

  • 将应用程序上下文自动连接到Springbean中,并使用appContext.getBeansOfType
  • 钩住后处理器并通过

    if(类型的bean实例)

  • 我觉得挂上后处理器只是为了处理一种类型的bean不是一个好主意。因为这将拦截所有bean初始化


    有人能提出更好的方法来解决我的用例吗?(给定类型的getBean)

    Spring对
    列表
    自动连接参数有特殊处理。如果您指定一个bean,例如:

    @Component
    class MyBean {
      @Autowired
      MyBean(List<MyType> listOfMytype) {
    
      }
    }
    
    @组件
    类MyBean{
    @自动连线
    MyBean(类型列表){
    }
    }
    

    然后spring将不会在applicationContext中搜索类型为
    List
    的bean,而是搜索实现
    MyType
    的所有bean,并将它们作为列表注入()。因此,您可以获得给定类型的所有bean。

    谢谢您的回答。我还有一个问题。在这种情况下使用applicationContext.getBeansOfType有什么错误?我们没有将代码耦合到具体的类。我们正在将它耦合到一个抽象类(或者可能是一个接口),我们正在通过自动连接该类型bean的列表来实现这一点。@yaswanth:我认为这更适合您所链接的问题。令我惊讶的是,这个问题的现有答案中没有一个能直接说明效果的例子。所以我加了一个: