
01 前言
在 Spring Boot 3.4.x 版本中,@Fallback 注解的引入为 bean 的注入逻辑提供了新的解决方案。
下面将深入探讨其用法及优势。
02 @Fallback 注解概述
@Fallback 注解与 @ConditionalOnSingleCandidate 配合使用。
当存在单个 Primary Bean 时条件匹配;
若无 Primary Bean,则存在单个非 Fallback Bean 时也会匹配。
03 @Fallback 注解的使用场景
- 创建项目与定义接口 :新建 Spring Boot 3.4.0 及以上版本项目,定义一个 MyService 接口。
- 实现多个 Bean :分别实现 MyServiceImpl1 和 MyServiceImpl2 两个类,均标注 @Service 注解。
- 定义 AnotherBean 类 :该类依赖 MyService 类型的 bean,并在构造函数中注入。
- 配置 @ConditionalOnSingleCandidate :在 AnotherConfiguration 配置类中,使用 @ConditionalOnSingleCandidate 注解来条件性地创建 AnotherBean Bean。
- 测试接口 :通过 IndexController 类中的 index 方法调用 AnotherBean 的 doSomething 方法。
当未使用 @Fallback 注解时,由于存在多个 MyService 类型的 Bean,启动项目会报错,表明无法确定注入哪一个 Bean。
但若在 MyServiceImpl1 类上添加 @Fallback 注解,项目则可正常启动并输出相应日志。
以下是优化后的代码示例及分析:
MyService 接口
java
public interface MyService {
void doSomething();
}
java
MyServiceImpl1 实现类
@Slf4j
@Service
@Fallback // 标识该类为回退实现
public class MyServiceImpl1 implements MyService {
@Override
public void doSomething() {
log.info("这是 MyServiceImpl1 的实现,作为回退选项");
}
}
MyServiceImpl2 实现类
java
@Slf4j
@Service
public class MyServiceImpl2 implements MyService {
@Override
public void doSomething() {
log.info("这是 MyServiceImpl2 的实现");
}
}
AnotherBean 类
java
public class AnotherBean {
private MyService myService;
public AnotherBean(MyService myService) {
this.myService = myService;
}
public void doSomething() {
myService.doSomething();
}
}
AnotherConfiguration 配置类
java
@Configuration
public class AnotherConfiguration {
@Bean
@ConditionalOnSingleCandidate(MyService.class) // 条件注解,基于单候选 Bean
public AnotherBean anotherBean(MyService myService) {
return new AnotherBean(myService);
}
}
IndexController 控制器
java
@RestController
public class IndexController {
private final AnotherBean anotherBean;
public IndexController(AnotherBean anotherBean) {
this.anotherBean = anotherBean;
}
@GetMapping("/index")
public String index() {
anotherBean.doSomething();
return "success";
}
}
注解 :
- MyService 接口定义了 doSomething 方法,作为业务操作的规范。
- MyServiceImpl1 和 MyServiceImpl2 类分别实现了 MyService 接口。
MyServiceImpl1 通过 @Fallback 注解标识为回退实现,在没有明确的 Primary Bean 时,它将作为候选。
-
AnotherBean 类依赖 MyService 类型的 Bean,并在构造函数中注入。
它通过调用 MyService 的 doSomething 方法来执行具体业务逻辑。
-
AnotherConfiguration 配置类中的 anotherBean 方法使用 @ConditionalOnSingleCandidate 注解。
该注解会检查 MyService 类型的 Bean 是否存在单个候选(包括 Primary Bean 或非 Fallback Bean)。
如果满足条件,则创建 AnotherBean Bean。
- IndexController 控制器通过构造函数注入 AnotherBean,并在 index 方法中调用其 doSomething 方法。
最后
Spring Boot 3.4.x 版本的 @Fallback 注解为开发者提供了更灵活的 bean 注入策略。
在面对多个实现类时,通过 @Fallback 注解可以有效避免因 Spring 无法确定注入哪个 Bean 而导致的项目启动失败问题。