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