@Primary介绍
@Primary
是 Spring 框架中的一个注解,用于在多个相同类型的 bean 中指定一个默认的 bean。当 Spring 容器在自动装配时遇到类型冲突,即存在多个相同类型的 bean 时,如果没有使用 @Qualifier
或其他方式指定具体的 bean,Spring 会自动选择标记有 @Primary
的 bean 进行注入。
@Primary源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Primary {
}
源代码截图
@Primary属性介绍
没有属性,哈哈!!
@Primary注解使用场景
-
默认 bean 选择:当 Spring 容器中有多个相同类型的 bean 时,如果不指定具体的 bean,Spring 在自动装配时可能会因为歧义而无法确定应该注入哪个 bean。使用
@Primary
可以指定一个 bean 作为默认选择,这样在没有其他指定的情况下,Spring 会自动注入这个 bean。 -
简化配置:在某些情况下,你可能希望在多个相同类型的 bean 中指定一个默认的 bean,以便在大多数情况下不需要显式指定 bean。使用
@Primary
可以简化配置,减少代码的复杂性。 -
与
@Qualifier
结合使用:在某些情况下,你可能希望在多个相同类型的 bean 中指定一个默认的 bean,但在某些特殊情况下需要使用其他 bean。使用@Primary
可以指定一个默认的 bean,而在特殊情况下使用@Qualifier
来指定具体的 bean。 -
在配置类中使用:除了在 bean 的属性或构造函数上使用
@Primary
,你还可以在配置类中使用@Primary
来指定 bean 的名称或限定符,以便在其他 bean 中使用。 -
与
@Component
、@Service
、@Repository
等注解结合使用:在定义 bean 时,可以使用@Primary
来指定一个 bean 作为默认选择,以便在其他 bean 中使用。 -
在
@Bean
注解中使用:在@Configuration
类中,你可以使用@Bean
注解来定义 bean,并使用@Primary
来指定 bean 作为默认选择,以便在其他 bean 中使用。
@Primary测试示例代码
示例代码 一:多个实现类的自动装配
@Service
public class DefaultEmailSender implements EmailSender {
// ...
}
@Service
public class SmsEmailSender implements EmailSender {
// ...
}
@Configuration
public class AppConfig {
@Bean
@Primary
public EmailSender emailSender() {
return new DefaultEmailSender();
}
@Bean
public EmailSender smsEmailSender() {
return new SmsEmailSender();
}
}
示例代码 二:配置类中的方法注入
@Configuration
public class WebConfig {
@Bean
public WebService webService() {
return new WebService();
}
@Bean
@Primary
public SecureWebService secureWebService() {
return new SecureWebService();
}
}
示例代码 三:优先级链的使用
@Service
@Profile("dev")
public class DevNotificationService implements NotificationService {
// ...
}
@Service
@Primary
@Profile("prod")
public class ProdNotificationService implements NotificationService {
// ...
}
在这个例子中,DevNotificationService
将在开发环境(dev
profile)中作为首选,而ProdNotificationService
将在生产环境(prod
profile)中作为首选。