它是如何在构造函数上运行Spring @Autowired注释的?

时间:2014-11-15 16:56:30

标签: java spring frameworks annotations spring-annotations

我正在研究Spring框架,我对此示例的构造函数中的 @Autowired 注释有以下疑问:

@Component
public class TransferServiceImpl implements TransferService {

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

究竟是什么意思? AccountRepository repo 对象(在某处定义为组件)会自动注入 TransferServiceImpl()构造函数吗?

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

TNX

2 个答案:

答案 0 :(得分:9)

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

1-零豆类型为AccountRepository。将抛出异常。

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

3-有多个类型为AccountRepository的bean:

  • 回退到bean名称。在这种情况下,Spring将查找名为AccountRepository的{​​{1}}类型的bean。如果找到匹配,则会注入。
  • 名称回退失败(多个bean具有相同的类型和名称)。将抛出异常。

答案 1 :(得分:2)

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