1.首先抛出一个问题:若是想要被Spring容器管理的Bean的路径再也不Spring Boot 的包扫描路径下,怎么办呢?也就是如何去加载第三方的Bean 呢?
有两种方式能够解决:
这里咱们使用Swagger的配置来作实验。
1:首先一个Swagger的配置类:SwaggerConfig
SwaggerConfig 代码:java
@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的打印的信息:spring
因此这时候我若是想要把SwaggerConfig 加载到Spring容器中的话 要怎么办呢?下面介绍两种方式
①:在Spring Boot Application 主类上 使用@Import 注解api
启动就能够看到Swagger的基础信息:ide
②:如今咱们将其改造一下,采用spring.factories 的方式去加载SwaggerConfig类,在resources目录下新建一个META-INF 的目录,而后在
新建一个spring.factories 的文件,里面的内容为:ui
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.sg.config.SwaggerConfig
而后在把Spring Boot 启动类上的@Import注释掉,启动发现也能够把SwaggerConfig加载到Spring 容器中this
到这就完成了加载一个Spring 不能扫描到的一个类,他能够是第三方的,也能够是本身写的,只要是Spring Boot 默认扫描路径不可以扫描到,均可以使用这种方式去加载!!!code