美文网首页
Spring Boot 之spring.factories

Spring Boot 之spring.factories

作者: wanggs | 来源:发表于2022-01-05 15:47 被阅读0次

    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 的注解)标记的 bean,并注册到 spring 容器中。

    如何解决Spring Boot不能被默认路径扫描

    @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. 工程结构
    image.png
    测试启动
    • 发现我的SwaggerConfig 类和 SpringBoot 的启动类ConfigApplication.java 不在同一级目录下,所以当Spring Boot 自动扫描包的时候,是扫描不到我的SwaggerConfig 的配置的,也就在控制台没有Swagger的打印的信息:
    image.png

    加载到Spring容器中的话 要怎么办呢?下面介绍两种方式

    在Spring Boot Application 主类上 使用@Import 注解

    image.png

    启动就可以看到Swagger的基础信息:

    image.png

    采用spring.factories 的方式去加载SwaggerConfig类,在resources目录下新建一个META-INF 的目录,然后在

    新建一个spring.factories 的文件,里面的内容为:

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

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

    image.png

    总结

    SpringFactoriesLoader 类,这个类实现了检索 META-INF/spring.factories 文件,并获取指定接口的配置的功能。在这个类中定义了两个对外的方法:

    由于@ComponentScan 注解只能扫描 spring-boot 项目包内的 bean 并注册到 spring 容器中,因此需要 @EnableAutoConfiguration 注解来注册项目包外的bean。而 spring.factories 文件,则是用来记录项目包外需要注册的bean类名。

    相关文章

      网友评论

          本文标题:Spring Boot 之spring.factories

          本文链接:https://www.haomeiwen.com/subject/bbxkcrtx.html