具有依赖性且没有@ComponentScan的Spring引导自动配置

时间:2018-02-15 13:45:02

标签: spring-boot dependency-injection spring-boot-actuator component-scan spring-boot-starter

Spring boot提供@ComponentScan来查找要扫描的包。

我正在构建一个内部带有@RestControllers package com.mylib.controller的库。还有其他类以及不同包中的构造型注释。

所以,如果有人正在使用com.myapp基础包开发SpringBoot Application。 他在他的应用程序中使用我的库。他需要提到@ComponentScan("com.mylib")来发现图书馆的刻板印象。

有没有办法扫描组件而不包括@ComponentScan中的库包?

由于spring-boot-starter-actuator仅使用依赖关系公开其端点,而不定义@ComponentScan。或者无论应用程序基础包如何都扫描的任何默认包。

2 个答案:

答案 0 :(得分:5)

您可以使用与Spring提供的Starters相同的样式创建Spring Boot Starter。它们本质上是一个带有spring.factories文件的jar文件库,指向@Configuration类,在其上加载一些其他注释以提供覆盖/ bean后退(@ConditionalOnMissingBean)并且通常提供他们自己的@ConfigurationProperties

StéphaneNic​​oll提供了一个如何构建一个的优秀演示。

https://github.com/snicoll-demos/hello-service-auto-configuration

Spring Boot文档中也记录了它。 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html

图书馆方法也可行,但我认为没有让它成为首发的好处。此外,对于任何库/入门者,我建议删除@ComponentScan并仅在@Configuration中定义bean。这适用于像@RestController等类型的类型,如果你在配置中创建@Bean,它将正常运行。

答案 1 :(得分:1)

Spring boot starter是由Spring设计并由Spring使用的特殊工件 您可以在the source code中查看主要包含的内容 spring.provides档案:

  

提供:spring-boot-actuator,micrometer-core

我不知道以与Spring Boot Starter相同的方式处理的确切方式,但作为可能接受的解决方法,您可以在jar中定义指定@Configuration的{​​{1}}类。

@ComponentScan("com.mylib")

通过这种方式,jar的客户只需要"只有"导入 @Configuration @ComponentScan("com.mylib") public class MyLibConfig { //... } 类:

@Configuration