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小时内删除。
发表评论