开发Spring Starter自动配置是否必须手动@Import所有组件?
问题解答
你不需要手动把所有类都列入@Import参数中,Spring Boot Starter场景下有更简便的自动扫描方案,核心原因是:引入Starter的业务应用默认只会扫描自身启动类所在包及子包下的组件,不会自动扫描Starter依赖里的类,所以你需要主动指定Starter的组件扫描规则。
可用方案
方案1:指定包路径扫描
在自动配置类上添加@ComponentScan注解,指定你的Starter中组件所在的根包路径,注解会自动识别该包下所有标注了@Component、@Service、@Configuration、@Controller等注解的类,自动注册为Spring Bean,不用逐个导入。
修改后的自动配置类示例如下:
@Configuration @ConditionalOnWebApplication @EnableConfigurationProperties({LoggerProviderProperties.class}) // 替换为你Starter组件存放的根包路径即可 @ComponentScan(basePackages = "com.log") public class ProviderAutoConfiguration { }
方案2:同包路径自动扫描
如果你的Starter所有组件都存放在ProviderAutoConfiguration所在的包或者它的子包下,可以直接添加@AutoConfigurationPackage注解,不需要手动填写包路径,Spring会自动把自动配置类所在的包加入扫描路径。
示例如下:
@Configuration @ConditionalOnWebApplication @EnableConfigurationProperties({LoggerProviderProperties.class}) @AutoConfigurationPackage public class ProviderAutoConfiguration { }
注意事项
- 如果扫描包下存在不需要注册的类,可以通过
@ComponentScan的excludeFilters属性配置过滤规则,避免多余Bean注册 - 建议Starter的组件统一放在固定的根包下,避免扫描路径覆盖业务应用的包,造成Bean冲突
你之前移除LogService.class就报错的原因是LoggerController依赖LogService,而你没把LogService注册到Spring容器中,使用上述扫描方案后,只要LogService标注了@Service注解,就会被自动识别注册,不需要再手动写到@Import里。
内容的提问来源于stack exchange,提问作者Davis
相关产品推荐
相关产品推荐

