如果多个实现类都没有通过@Primary注解或其他方式指定优先级等特殊配置,且这些实现类都能匹配到@Autowired所要求的类型,Spring 会尝试按照类型进行注入。但这种情况下可能会抛出NoUniqueBeanDefinitionException异常,因为 Spring 容器无法确定应该注入哪个实现类。例如有接口Animal和它的实现类Dog、Cat,且都被 Spring 管理,如果直接在某个类中@Autowired注入Animal类型,Spring 就会不知道该注入Dog还是Cat。
按名称注入
Spring 会首先按照@Autowired所标注的字段名或方法参数名,去容器中查找对应的 Bean 名称。如果有一个实现类的 Bean 名称与字段名或方法参数名一致,那么就会注入这个实现类。比如在上述Animal的例子中,如果Dog这个实现类被命名为dogBean,而在需要注入的类中有一个@Autowired标注的dogBean字段,那么 Spring 就会尝试将Dog实现类注入到该字段。
使用 @Primary 注解
可以在多个实现类中的某个类上添加@Primary注解,来告诉 Spring 在存在多个候选 Bean 时,优先选择标注了@Primary的 Bean 进行注入。例如在Dog类上添加@Primary注解,那么当使用@Autowired注入Animal类型时,Spring 会优先选择Dog类进行注入。