Springboot3.4版本中的@Fallback

419 阅读1分钟

前言

@FallbackSpringboot3.4.x版本之后提供的注解,用于条件注解@ConditionalOnSingleCandidate使用,如果有单个 Primary Bean,条件就会匹配;如果没有 Primary Bean,如果有单个非 Fallback Bean,条件也会匹配

@Fallback使用

新建一个Springboot3.4.0版本以上的项目,定义一个接口

public interface MyService {
    void doSomething();

}

然后实现两个bean

@Slf4j
@Service
public class MyServiceImpl1 implements MyService {

    @Override
    public void doSomething() {
        log.info("==============MyServiceImpl1=========");
    }
}
@Slf4j
@Service
public class MyServiceImpl2 implements MyService {

    @Override
    public void doSomething() {
        log.info("==============MyServiceImpl2=========");
    }
}

然后定义一个service类

public class AnotherBean{

    private MyService myService;

    public AnotherBean(MyService myService) {
        this.myService = myService;
    }


    public void doSomething() {
        myService.doSomething();
    }
}

最后使用注解@ConditionalOnSingleCandidate注入bean

@Configuration
public class AnotherConfiguration {

    @Bean
    @ConditionalOnSingleCandidate(MyService.class)
    public AnotherBean anotherBean(MyService myService) {
        return new AnotherBean(myService);
    }

}

然后写一个测试接口

@RestController
public class IndexController {

    @Autowired
    private AnotherBean anotherBean;

    @GetMapping("/index")
    public String index() {
        anotherBean.doSomething();
        return "success";
    }
}

如果没有使用@Fallback,启动会报错

image.pngMyServiceImpl1使用@Fallback

@Slf4j
@Service
@Fallback
public class MyServiceImpl1 implements MyService {

    @Override
    public void doSomething() {
        log.info("==============MyServiceImpl1=========");
    }
}

启动的时候,调用接口

http://ip:端口/index

会输出

image.png

总结

Springboot3.4.x版本提供了这个新注解,可以根据自己需求使用