@Autowired 是 Spring 框架提供的注解,主要用于自动装配 bean 之间的依赖关系。当我们在类的字段、构造函数、setter 方法或方法参数上使用此注解时,Spring 容器会在运行时扫描上下文,根据类型自动匹配并注入对应的 bean。

作用:

  • 类型驱动注入:默认情况下,@Autowired 注解会根据类型进行注入,这意味着 Spring 容器会查找所有类型匹配的 bean,并尝试注入。
  • 如果希望按名称注入,则可以在 @Autowired 注解中添加 required=falsequalifier="beanName" 属性,指定确切的 bean 名称进行注入。
  • 当注入点只有一个匹配的 bean 时,Spring 容器会自动注入该 bean。

NoUniqueBeanDefinitionException 异常:
NoUniqueBeanDefinitionException 异常发生在 Spring 容器中存在两个或以上相同类型的 bean,但 @Autowired 注解没有足够的信息来确定应该注入哪一个 bean 的时候。换句话说,当 Spring 容器在解析注解时找不到唯一匹配的 bean 时,就会抛出这个异常。

为了避免这种情况,可以采取以下措施:

  • 使用 @Qualifier 注解配合 @Autowired,明确指定注入的 bean 的名称或别名。
  • 如果是在接口或抽象类上有多个实现,可以选择其中一个实现类上添加 @Primary 注解,表明这是一个首选的 bean,当出现多个候选者时优先注入。
  • 在配置类或 XML 配置中明确设置某个 bean 的作用域或其他属性以区分不同 bean。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Service
public class ServiceA implements IService {
// ...
}

@Service
@Primary
public class ServiceB implements IService {
// ...
}

public class ConsumerClass {
@Autowired
private IService service; // 若未指定 @Qualifier 或 @Primary,此处将引发 NoUniqueBeanDefinitionException
}

在这个例子中,如果试图注入 IService 类型的 bean 而未提供任何进一步的限定条件,由于存在 ServiceAServiceB 两个实现,Spring 将无法决定注入哪个 bean,因此会抛出 NoUniqueBeanDefinitionException 异常。为了解决这个问题,可以给其中一个服务类加上 @Primary 注解,或者在注入点使用 @Qualifier("serviceB") 明确指定注入的 bean。