spring接口注入按类型优先匹配,唯一实现则自动注入;多实现时需@qualifier指定名称或@resource按字段名查找,@primary可标记默认首选实现。

接口注解属性注入的容器自动匹配,核心是 Spring 如何根据类型和名称把实现类塞进字段里——不是“随便挑一个”,而是有明确优先级和 fallback 机制。
按类型匹配是默认行为
@Autowired 默认只看类型(Type):只要容器中存在且仅存在一个该接口的实现类,就直接注入。比如:
- 接口 UserDao 只有一个实现类 UserDaoMysql → 自动注入成功
- 若同时存在 UserDaoMysql 和 UserDaoOracle → 启动报错:“expected single matching bean but found 2”
同类型多个实现时,必须指定名称
当接口有多个实现,Spring 无法凭类型唯一确定时,会退而求其次看 bean 名称(Name)。这时需配合 @Qualifier 显式指定:
- 用 @Qualifier("userDaoMysql") 指向具体 bean 名
- bean 名默认是类名首字母小写(UserDaoMysql → userDaoMysql)
- 若类名首字母和第二字母都大写(如 CNService),则 bean 名保持原样(CNService)
@Resource 是另一条路径:先按名称,再 fallback 到类型
@Resource 不依赖 Spring 容器,是 Java EE 标准注解:
- 默认先按字段名找 bean 名(private UserDao userDao; → 尝试找名为 userDao 的 bean)
- 找不到时,才按类型匹配(类似 @Autowired 的默认逻辑)
- 也可显式写 @Resource(name = "userDaoOracle") 强制指定
@Primary 是全局优先级标记
如果不想每次写 @Qualifier,又希望某个实现“默认被选中”,可在其实现类上加 @Primary:
- @Primary 标在 UserDaoMysql 类上 → 它成为同类型 bean 中的首选
- 其他地方用 @Autowired 注入 UserDao 时,自动选它,无需额外标注
- 注意:@Primary 只能标在一个实现类上,否则仍会冲突











