40. @Primary注解在Spring中如何使用?
大约 2 分钟
在 Spring 中,@Primary
注解用于在有多个候选 Bean 可供注入时指定一个优先选择的 Bean。这在避免歧义和简化注入选择时非常有用。@Primary
通常与 @Autowired
一起使用,以解决多重注入的问题。
1. 使用场景
当存在多个相同类型的 Bean 时,如果不使用 @Primary
或 @Qualifier
注解,Spring 在进行自动注入时会抛出 NoUniqueBeanDefinitionException
异常,因为它无法确定注入哪一个 Bean。@Primary
允许你指定一个默认的候选 Bean,Spring 会优先注入这个 Bean。
2. 基本用法
假设你有两个实现相同接口的 Bean,Spring 需要注入其中一个到一个字段中:
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
public interface MyService {
void performTask();
}
@Component
public class MyServiceImpl1 implements MyService {
@Override
public void performTask() {
System.out.println("Service 1 is performing the task");
}
}
@Component
@Primary
public class MyServiceImpl2 implements MyService {
@Override
public void performTask() {
System.out.println("Service 2 is performing the task");
}
}
在上面的例子中,MyServiceImpl2
被标注为 @Primary
,因此它是默认注入的 Bean。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ClientComponent {
private final MyService myService;
@Autowired
public ClientComponent(MyService myService) {
this.myService = myService;
}
public void execute() {
myService.performTask();
}
}
当 ClientComponent
被 Spring 管理时,myService
将被注入为 MyServiceImpl2
实例,因为它被标记为 @Primary
。
3. 与 @Qualifier
一起使用
在一些情况下,你可能需要在某些地方使用 @Primary
指定的默认 Bean,而在其他地方使用特定的 Bean。这时可以使用 @Qualifier
注解:
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class AnotherClientComponent {
private final MyService myService;
@Autowired
public AnotherClientComponent(@Qualifier("myServiceImpl1") MyService myService) {
this.myService = myService;
}
public void execute() {
myService.performTask();
}
}
在这个例子中,即使 MyServiceImpl2
被标记为 @Primary
,AnotherClientComponent
中的 myService
依然会被注入为 MyServiceImpl1
实例,因为使用了 @Qualifier
来指定具体的 Bean。
4. 总结
@Primary
注解:用于指定在多个候选 Bean 中的优先选择。当有多个同类型的 Bean 时,Spring 会优先选择标记了@Primary
的 Bean 进行注入。- 解决歧义:当存在多个同类型 Bean 且没有使用
@Qualifier
指定注入 Bean 时,@Primary
可以避免注入歧义,提供一个默认的选择。 - 与
@Qualifier
搭配使用:如果你需要更精确地控制注入行为,可以使用@Qualifier
注解,它允许你在特定情况下覆盖@Primary
的行为,注入指定的 Bean。
通过 @Primary
和 @Qualifier
,Spring 提供了强大的功能来管理多重 Bean 注入的场景,确保你可以灵活而准确地控制 Bean 的选择。