SpringBoot 之spring.factories
引⾔
  在java spring cloud 项⽬中,我们常常会在⼦模块中创建公共类库,作为驱动包。那么在另外⼀个⼦模块中,需要加载配置⽂件的时候,往往Spring Boot ⾃动扫描包的时候,只
会扫描⾃⼰模块下的类。
抛出⼀个问题
  ⾸先抛出⼀个问题:如果想要被Spring 容器管理的Bean 的路径不再Spring Boot 的包扫描路径下,怎么办呢?也就是如何去加载第三⽅的Bean 呢?
  有两种⽅式可以解决:
  这⾥我们使⽤Swagger 的配置来做实验。
  1:⾸先⼀个Swagger 的配置类:SwaggerConfig
  SwaggerConfig 代码:
  2
:再看我的⼯程结构吧:
  发现我的SwaggerConfig 类和 SpringBoot 的启动类ConfigApplication.java 不在同⼀级⽬录下,所以当Spring Boot ⾃动扫描包的时候,是扫描不到我的SwaggerConfig 的配置
的,也就在控制台没有Swagger
的打印的信息:
@Configuration
spring boot选择题@EnableSwagger2
public  class  SwaggerConfig implements  EnvironmentAware {
private  static  final  Logger log = Logger(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 .ActiveProfiles()).contains("prod")) {
path = ();
}
log.info("####初始化createRestApi####swaggerScanPackage:" + this .swaggerScanPackage);
log.String());
return  (new  Docket(DocumentationType.SWAGGER_2)).apiInfo(this .apiInfo()).select().apis(RequestHandlerSelectors.basePackage(this .swaggerScanPackage    }
private  ApiInfo apiInfo() {
log.info(">>>>>>####初始化API 信息>>>>>>>>>###");
return  (new  ApiInfoBuilder()).title("APIs").description("…………").termsOfServiceUrl("js.dazhi.loan").version("1.0").build();
}
@Override
public  void  setEnvironment(Environment environment) {
}}
View Code
  所以这时候我如果想要把SwaggerConfig 加载到Spring容器中的话要怎么办呢?下⾯介绍两种⽅式
⽅法⼀、在Spring Boot Application 主类上使⽤@Import 注解
⽅法⼆、创建spring.factories⽂件
  现在我们将其改造⼀下,采⽤spring.factories 的⽅式去加载SwaggerConfig类,在resources⽬录下新建⼀个META-INF 的⽬录,然后在
新建⼀个spring.factories 的⽂件,⾥⾯的内容为:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
fig.SwaggerConfig
  然后在把Spring Boot 启动类上的@Import注释掉,启动发现也可以把SwaggerConfig加载到Spring 容器中
  到这就完成了加载⼀个Spring 不能扫描到的⼀个类,他可以是第三⽅的,也可以是⾃⼰写的,只要是Spring Boot 默认扫描路径不能够扫描到,都可以使⽤这种⽅式去加载!!!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论