Spring Boot 之spring.factories

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 注解 示例

  1. 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) {

    }
}

  1. 工程結(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類名。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容