如何正确导入外部配置类定义的@Bean供RestController使用
问题背景
当前编写的RestController代码如下:
@RestController public class SomeOperations { private RepositoryFailover repo; public SomeOperations (RepositoryFailover repo) { this.repo = repo; } }
依赖的RepositoryFailover来自外部Jar包,该类对应的Bean在外部Jar的FailoverConfiguration配置类中通过@Bean声明:
@Configuration public class FailoverConfiguration { @Bean public RepositoryFailover repoFailover(ClassA abc) { return new RepositoryFailover(abc); } }
项目启动抛出如下错误:
No qualifying bean of type RepositoryFailover available
报错本质是Spring默认的组件扫描范围只覆盖项目启动类所在的包及其子包,外部Jar中的配置类没有被Spring识别,因此不会加载其中定义的RepositoryFailover Bean。
可行解决方案
按场景选对应方案即可:
- 直接导入指定配置类
在项目启动类,或者任意一个能被Spring扫描到的自定义配置类上,添加@Import(FailoverConfiguration.class)注解,Spring会直接加载该外部配置类,完成对应Bean的注册。示例代码:
这个方案适合只需要加载外部Jar中个别配置类的场景,侵入性最低。@SpringBootApplication @Import(FailoverConfiguration.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } - 扩大组件扫描范围
如果外部Jar中有多个Bean、配置类需要加载,可以在启动类上通过@ComponentScan追加外部包的扫描路径。注意必须同时把你自身项目的根包路径也加到扫描规则里,否则会覆盖Spring Boot默认的扫描配置,导致你自己项目里写的Bean无法被识别。示例:@SpringBootApplication @ComponentScan(basePackages = {"你自己项目的根包全路径", "外部Jar中配置类所在的包全路径"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } - 配置外部Jar自动装配(可修改外部Jar源码时使用)
如果你有权限修改外部Jar的代码,可以直接在Jar中配置Spring Boot自动装配规则,不需要业务使用方手动加注解导入:- Spring Boot 2.7及以上版本:在外部Jar的
resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中,逐行写入需要自动加载的配置类全限定名,这里写FailoverConfiguration的全类名即可 - Spring Boot 2.7以下版本:在外部Jar的
resources/META-INF/spring.factories文件中,添加如下配置:org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xxx.FailoverConfiguration
- Spring Boot 2.7及以上版本:在外部Jar的
内容的提问来源于stack exchange,提问作者Plainsage
相关产品推荐
相关产品推荐

