大数跨境
0
0

Spring6.2新特性@Fallback候选Bean

Spring6.2新特性@Fallback候选Bean Spring全家桶实战案例
2024-05-05
0
导读:Spring6.2新特性@Fallback候选Bean

环境:6.2.0-SNAPSHOT



1. 简介

当Spring容器中存在多个相同类型的Bean,并且需要确定在自动装配时应该使用哪个Bean时,@Primary注解就派上了用场。如下示例:

public interface CommonDAO {}public class UserDAO implements CommonDAO {}public class PersonDAO implements CommonDAO {}public class CommonService {  private CommonDAO dao ;  public CommonService(CommonDAO dao) {    this.dao = dao ;  }}@Configurationpublic class Module1Config {  @Bean  public UserDAO userDAO() {    return new UserDAO() ;  }  @Bean  public CommonService commonService(CommonDAO dao) {    return new CommonService(dao) ;  }}@Configurationpublic class Module2Config{  @Bean  @Primary  public PersonDAO personDAO() {    return new PersonDAO() ;  }}

当有多个Bean时,使用@Primary不是唯一的方法,其它方法请查看如下文章

掌握Spring这些注入技巧让你事半功倍

有时,我们希望能够在不破坏现有代码的情况下注册一个给定类型的 Bean,尤其是在多模块项目中。就如上面的代码,如果让你不改动现有代码的情况下,我们希望在新增模块时,只有在原来的Bean缺失的情况下,新增模块中的Bean生效,通过上面@Primary是没法实现的。从Spring6.2开始新增了一个注解,可以用来解决该问题。

2. 新特性Fallback

Spring6.2新增了一个@Fallback注解,该注解表示该 bean 符合备用自动装配候选条件,这是 @Primary 注释的替代品。如果多个匹配候选者中只有少数几个被标记为fallback,则剩余的 bean 将被选中。与Primary bean 一样,备用 bean 仅在查找单个注入点的多个候选者时起作用。在自动装配数组、集合、映射或 ObjectProvider 流时,所有类型匹配的 bean 都将被包括在内。使用示例如下:

@Configurationpublic class AppConfig {  @Bean  public UserDAO userDAO() {    return new UserDAO() ;  }  @Bean  @Fallback  public PersonDAO personDAO() {    return new PersonDAO() ;  }  @Bean  public CommonService commonService(CommonDAO dao) {    return new CommonService(dao) ;  }}

上面的示例中,CommonService注入的是UserDAO。当UserDAO Bean不存在时,才会注入PersonDAO。

如果定义多个@Fallback而没有默认的,那么针对单注入点是会报错。

@Bean@Fallbackpublic UserDAO userDAO() {  return new UserDAO() ;}@Bean@Fallbackpublic PersonDAO personDAO() {  return new PersonDAO() ;}

如果两个bean分别由@Fallback@Primary标注,@Primary优先级高

@Fallbackpublic UserDAO userDAO() {}@Primarypublic PersonDAO personDAO() {}

注意:
6.2版本开始Bean的自动装配算法略有修改,在一组按类型匹配的候选 Bean 中,参数名称匹配和 @Qualifier("...")匹配(针对目标 Bean 名称)会推翻 @jakarta.annotation.Priority 排序,而以前是反过来检查的。总结如下:

从6.2开始,如果有多个符合条件的bean时,依赖注入的查找顺序如下:

  1. @Primary(这里会先找@Primary,然后再从非@Fallback中查找)

  2. 根据字段名称或参数名(按照名称)

  3. @Qualifier限定名,指定的value名称

  4. @Priority

  5. 选择直接注册的依赖项(在定义BeanFactory时就提起定义好某个类型注入的时候使用的类)

而在6.2之前版本,依赖注入的查找顺序如下:

  1. @Primary

  2. @Priority

  3. 选择直接注册的依赖项


上面所说的直接注册的依赖项,就是通过如下方式静态注册

// 手动创建BeanFactoryDefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory() ;beanFactory.registerResolvableDependency(CommonDAO.class, TeacherDAO.class) ;


以上是本篇文章的全部内容,如对你有帮助就请作者吃个棒棒糖🍭。

完毕!!!

推荐文章

基于注解的Controller接口这些高级功能你都知道吗?

快速体验Spring AI 聊天对话&文生图&文生语音

OpenFeign高级用法:这些强大的功能你用过吗?

SpringBoot整合RSocket实时数据通信

SpringBoot优雅地定制JSON响应数据

SpringBatch高阶应用:大数据批处理框架实战指南

实战Spring Cloud Gateway自定义谓词及网关过滤器

一个注解完美实现分布式锁

SpringBoot整合Flink CDC,实时追踪数据变动,无缝同步至Redis

SpringBoot这些Web知识点你知道吗?

SpringBoot项目开发的智慧锦囊:技巧与应用一网打尽

【收藏】Spring竟然支持这么多数据类型的注入方式!

请一定牢记SpringBoot项目开发中的8个扩展接口


【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读7
粉丝0
内容832