zoukankan      html  css  js  c++  java
  • Spring Boot 之 spring.factories

    引言

      在java spring cloud项目中,我们常常会在子模块中创建公共类库,作为驱动包。那么在另外一个子模块中,需要加载配置文件的时候,往往Spring Boot 自动扫描包的时候,只会扫描自己模块下的类。

    抛出一个问题

      首先抛出一个问题:如果想要被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) {
    
        }
    }
    View Code

      2:再看我的工程结构吧:

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

       所以这时候我如果想要把SwaggerConfig 加载到Spring容器中的话 要怎么办呢?下面介绍两种方式

    方法一、在Spring Boot Application 主类上 使用@Import 注解

      

     方法二、创建spring.factories文件

      现在我们将其改造一下,采用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 默认扫描路径不能够扫描到,都可以使用这种方式去加载!!!

  • 相关阅读:
    Delphi以及三方控件的源代码规模
    InitInheritedComponent的执行过程
    poj 3897 Maze Stretching 二分+A*搜索
    一些窗口API函数,比如SetForegroundWindow,SwitchToThisWindow
    终于懂了:WM_PAINT 与 WM_ERASEBKGND(三种情况:用户操作,UpdateWindow,InvalidateRect产生的效果并不相同),并且用Delphi代码验证 good
    窗口绘制有关的消息整理 WM_PAINT, WM_NCPAINT, WM_ERASEBKGND
    WM_PAINT与WM_ERASEBKGND(用户操作和API这两种情况产生消息的顺序有所不同)
    关于WM_ERASEBKGND和WM_PAINT的深刻理解
    offsetHeight在OnLoad中为0的现象
    TWinControl.WMNCPaint对非客户的绘制
  • 原文地址:https://www.cnblogs.com/huanghzm/p/12217630.html
Copyright © 2011-2022 走看看