【问题标题】:Best practice to get spring beans of given type获取给定类型的春豆的最佳实践
【发布时间】:2017-01-25 12:38:11
【问题描述】:

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

Why is Spring's ApplicationContext.getBean considered bad?

我想知道在春季是否有更好的方法来扫描给定类型的 bean。

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

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

  1. 将应用程序上下文自动装配到 Spring bean 中并使用 appContext.getBeansOfType。
  2. 挂钩后处理器并通过

    过滤给定类型的bean

    if(bean 类型的实例)

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

谁能提出更好的方法来解决我的用例? (getBeans 给定类型)

【问题讨论】:

    标签: java spring


    【解决方案1】:

    Spring 对 List 自动装配参数有特殊处理。如果您指定一个 bean,例如像这样:

    @Component
    class MyBean {
      @Autowired
      MyBean(List<MyType> listOfMytype) {
    
      }
    }
    

    然后 spring 将不会在您的 applicationContext 中搜索 List&lt;MyType&gt; 类型的 bean,而是搜索所有实现 MyType 的 bean 并将它们作为列表 (which may suck if you actually want to get a list injected) 注入。因此,您可以获得给定类型的所有 bean。

    【讨论】:

    • 感谢您的回答。我还有一个问题。在这种情况下使用 applicationContext.getBeansOfType 有什么问题?我们没有将代码耦合到具体的类。我们将它耦合到一个抽象类(或者可能是一个接口),无论如何我们通过自动装配该类型的 bean 列表来实现。
    • @yaswanth:我认为这更适合您所链接的问题。令我惊讶的是,这个问题中的现有答案都没有一个可以看到效果的直接示例。所以我加了一个:stackoverflow.com/a/41853545/327301
    猜你喜欢
    • 2018-04-23
    • 2011-12-13
    • 2012-11-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多