Spring Boot 之spring.factories
Spring Boot 如何管理第三方Bean?
- 首先拋出一個問題:如果想要被Spring容器管理的Bean的路徑不再Spring Boot 的包掃描路徑下,怎么辦呢?也就是如何去加載第三方的Bean 呢?
- 換句話說:在 Spring Boot 項目中,如果你想要被 Spring 容器管理的 bean 不在 Spring Boot 包掃描路徑下,怎么辦?
Spring Boot 管理Bean
- @ComponentScan 注解的作用是掃描 @SpringBootApplication 所在的 Application 類所在的包(basepackage)下所有的
- @component 注解(或拓展了 @component 的注解)標(biāo)記的 bean,并注冊到 spring 容器中。
如何解決Spring Boot不能被默認(rèn)路徑掃描
@Import 、spring.factories 兩種方式
- 在 Spring Boot 主類上使用 @Import 注解
- 使用 spring.factories 文件
@Import 注解 示例
- SwaggerConfig 代碼
@Configuration
@EnableSwagger2
public class SwaggerConfig implements EnvironmentAware {
private static final Logger log = LoggerFactory.getLogger(SwaggerConfig.class);
@Autowired
private Environment env;
@Value("${swagger.scan.package}")
private String swaggerScanPackage;
public SwaggerConfig() {
}
@Bean
public Docket createRestApi() {
Predicate<String> path = PathSelectors.any();
if (Arrays.asList(this.env.getActiveProfiles()).contains("prod")) {
path = PathSelectors.none();
}
log.info("####初始化createRestApi####swaggerScanPackage:" + this.swaggerScanPackage);
log.info(path.toString());
return (new Docket(DocumentationType.SWAGGER_2)).apiInfo(this.apiInfo()).select().apis(RequestHandlerSelectors.basePackage(this.swaggerScanPackage)).paths(PathSelectors.any()).build();
}
private ApiInfo apiInfo() {
log.info("##################################初始化API信息################################################");
return (new ApiInfoBuilder()).title("APIs").description("…………").termsOfServiceUrl("https://js.dazhi.loan.com").version("1.0").build();
}
@Override
public void setEnvironment(Environment environment) {
}
}
- 工程結(jié)構(gòu)

image.png
測試啟動
- 發(fā)現(xiàn)我的SwaggerConfig 類和 SpringBoot 的啟動類ConfigApplication.java 不在同一級目錄下,所以當(dāng)Spring Boot 自動掃描包的時候,是掃描不到我的SwaggerConfig 的配置的,也就在控制臺沒有Swagger的打印的信息:

image.png
加載到Spring容器中的話 要怎么辦呢?下面介紹兩種方式
在Spring Boot Application 主類上 使用@Import 注解

image.png
啟動就可以看到Swagger的基礎(chǔ)信息:

image.png
采用spring.factories 的方式去加載SwaggerConfig類,在resources目錄下新建一個META-INF 的目錄,然后在
新建一個spring.factories 的文件,里面的內(nèi)容為:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.sg.config.SwaggerConfig
然后在把Spring Boot 啟動類上的@Import注釋掉,啟動發(fā)現(xiàn)也可以把SwaggerConfig加載到Spring 容器中

image.png
總結(jié)
SpringFactoriesLoader 類,這個類實現(xiàn)了檢索 META-INF/spring.factories 文件,并獲取指定接口的配置的功能。在這個類中定義了兩個對外的方法:
由于@ComponentScan 注解只能掃描 spring-boot 項目包內(nèi)的 bean 并注冊到 spring 容器中,因此需要 @EnableAutoConfiguration 注解來注冊項目包外的bean。而 spring.factories 文件,則是用來記錄項目包外需要注冊的bean類名。