构造函数上的 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 不止一个:
AccountRepository
且名称为 repo
的 bean。如果找到匹配项,则将其注入。
名称回退失败(多个具有相同类型和名称的 bean)。将引发异常。
【讨论】:
【参考方案2】:@Component
告诉扫描进程这个类是一个 bean,@autowire
告诉后处理器在 spring 存储库中搜索AccountRepository
类型的 bean。如果找到 bean,它将与带注释的构造函数一起使用。根据范围,将使用新实例 (prototype
) 或传递已实例化的 bean (singleton
)。如果无论如何有两个 bean 匹配构造函数参数,则会抛出异常。
【讨论】:
以上是关于构造函数上的 Spring @Autowired 注释如何工作?的主要内容,如果未能解决你的问题,请参考以下文章