构造函数上的 Spring @Autowired 注释如何工作?

Posted

技术标签:

【中文标题】构造函数上的 Spring @Autowired 注释如何工作?【英文标题】:How it work the Spring @Autowired annotation on a constructor? 【发布时间】:2014-11-15 16:56:30 【问题描述】:

我正在研究Spring框架,我对这个例子的构造函数上的@Autowired注解有以下疑问:

@Component
public class TransferServiceImpl implements TransferService 

    @Autowired
    public TransferServiceImpl(AccountRepository repo) 
        this.accountRepository = repo;
    

那么究竟是什么意思呢? AccountRepository repo 对象(在某处定义为 component)自动注入到 TransferServiceImpl() 构造函数中?

这个操作是如何工作的?它是按类型完成的吗? (因为 AccountRepository 是 Spring 默认的 singleton),还是什么?

Tnx

【问题讨论】:

【参考方案1】:

Spring 将在容器中查找 AccountRepository bean。有多种可能的情况:

1- 类型为 AccountRepository 的 bean 为零。会抛出异常。

2- 有一个类型为AccountRepository 的bean。构造 TransferServiceImpl 时会注入 bean。

3- 类型为AccountRepository 的bean 不止一个:

回退到 bean 名称。在这种情况下,Spring 将查找类型为 AccountRepository 且名称为 repo 的 bean。如果找到匹配项,则将其注入。 名称回退失败(多个具有相同类型和名称的 bean)。将引发异常。

【讨论】:

【参考方案2】:

@Component 告诉扫描进程这个类是一个 bean,@autowire 告诉后处理器在 spring 存储库中搜索AccountRepository 类型的 bean。如果找到 bean,它将与带注释的构造函数一起使用。根据范围,将使用新实例 (prototype) 或传递已实例化的 bean (singleton)。如果无论如何有两个 bean 匹配构造函数参数,则会抛出异常。

【讨论】:

以上是关于构造函数上的 Spring @Autowired 注释如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

@Autowired的使用:推荐对构造函数进行注释

@Autowired的使用:推荐对构造函数进行注释

@Autowired的使用:推荐对构造函数进行注释

@Autowired注解详解

spring annotation功能备注

Spring注解——@Autowired