【问题标题】:Why @resource can find all classes implements an interface and inject them as a list为什么@resource 可以找到所有类都实现了一个接口并将它们作为列表注入
【发布时间】:2019-01-03 07:55:14
【问题描述】:

我想在我的应用程序中注入一个列表。我的代码喜欢这样:

interface A;
class B implements A;
class C implements A;

class D {
    @Resource
    private list<A> list;
}

为了注入list,我打算在xml中配置列表,但我发现我不需要。并且当我使用@resource 时列表已经注入到应用程序中,我想知道@resource 在这里是如何工作的。

【问题讨论】:

  • 不是@Resource,它告诉容器注入它已经拥有的实例。您正在寻找 Spring 组件扫描。
  • 我没有看到 @resource 注释是 Spring Boot 应用程序的一部分。有一个javax 注释:@Resource。您能否详细说明您的问题,以包括使用 @resource 的包名称。
  • @Prashant 我的意思是@Resource

标签: java list spring-boot interface inject


【解决方案1】:

@Resource 注释告诉 Spring 在应用程序上下文中查找与所需类型匹配的任何 bean,并将其注入到变量中。

在您的情况下,将该字段指定为 List&lt;A&gt; 将向 Spring 表明您希望注入所有类型 A 的 bean。

Spring 支持 DI 的以下注解:

  • @Resource,用于基于资源名称的注入的 JavaEE 规范
  • @Inject,JavaEE 规范,保持代码兼容
  • @Autowired,@Inject 的 Spring 特定计数器部分

【讨论】:

  • 我知道@Resource 可以做到。但我想知道它是如何工作的,或者在哪里可以找到它的工作原理。
  • 如前所述,它表明 Spring 需要在应用程序上下文中查找匹配的 bean。应用程序上下文包含所有用 bean 限定注释标记的类实例(例如 Bean 服务组件)
【解决方案2】:

@Autowired 相同,用于注入依赖。

不同之处在于 @Resource 是标准的 java 注释(来自 JSR-250),Spring 也支持它进行注入。

我个人使用@Autowired,因为@Resource 仅支持字段和setter 注入,而@Autowired 支持更多,例如构造函数和多参数方法注入。

【讨论】:

  • 我不是在问这两个注释的不同之处,但我想知道@Resource 是如何将所有类型 A 放到一个列表中的。
  • 高级原因是 Spring 使用 Reflection 拥有关于所有 bean 的所有元数据。将所有 TypeA 放到一个列表中相当于从 applicationContext 中找出所有 TypeA 的 bean,然后将它们一一添加到列表中。这是你想知道的吗?
  • 有点。有没有办法可以找到@Resource 工作的源代码?我没找到。
  • 查看 CommonAnnotationBeanPostProcessorDefaultListableBeanFactory#resolveMultipleBeans ,应该有助于研究它的工作原理。
猜你喜欢
  • 2018-10-24
  • 2013-05-24
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
相关资源
最近更新 更多