Spring Boot 之spring.factories

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 之spring.factories相关的知识,希望对你有一定的参考价值。

1.首先抛出一个问题:如果想要被Spring容器管理的Bean的路径不再Spring Boot 的包扫描路径下,怎么办呢?也就是如何去加载第三方的Bean 呢?

有两种方式可以解决:
这里我们使用Swagger的配置来做实验。
1:首先一个Swagger的配置类:SwaggerConfig
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) 

    

2:再看我的工程结构吧:
技术图片
发现我的SwaggerConfig 类和 SpringBoot 的启动类ConfigApplication.java 不在同一级目录下,所以当Spring Boot 自动扫描包的时候,是扫描不到我的SwaggerConfig 的配置的,也就在控制台没有Swagger的打印的信息:

技术图片

所以这时候我如果想要把SwaggerConfig 加载到Spring容器中的话 要怎么办呢?下面介绍两种方式
①:在Spring Boot Application 主类上 使用@Import 注解
技术图片

启动就可以看到Swagger的基础信息:
技术图片

②:现在我们将其改造一下,采用spring.factories 的方式去加载SwaggerConfig类,在resources目录下新建一个META-INF 的目录,然后在
新建一个spring.factories 的文件,里面的内容为:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.sg.config.SwaggerConfig

然后在把Spring Boot 启动类上的@Import注释掉,启动发现也可以把SwaggerConfig加载到Spring 容器中
技术图片

到这就完成了加载一个Spring 不能扫描到的一个类,他可以是第三方的,也可以是自己写的,只要是Spring Boot 默认扫描路径不能够扫描到,都可以使用这种方式去加载!!!

以上是关于Spring Boot 之spring.factories的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 系列之四:spring boot 整合JPA

spring boot 之依赖

Spring Boot参考教程Spring Boot配置使用之配置文件用法

Spring-Boot 之Thymeleaf

Spring Boot Sample 013之spring-boot-web-cors

Spring Boot Sample 013之spring-boot-web-cors