【发布时间】:2016-02-10 17:07:01
【问题描述】:
我的 Spring Boot 配置有问题。
我已经使用https://start.spring.io/创建了基础 Spring Boot 项目
我有一个问题,配置仅适用于子目录中的类:
我尝试过注释@ComponentScan,但没有帮助。
你知道我能用这个做什么吗?
【问题讨论】:
标签: java spring gradle spring-boot
我的 Spring Boot 配置有问题。
我已经使用https://start.spring.io/创建了基础 Spring Boot 项目
我有一个问题,配置仅适用于子目录中的类:
我尝试过注释@ComponentScan,但没有帮助。
你知道我能用这个做什么吗?
【问题讨论】:
标签: java spring gradle spring-boot
Spring Boot documentation for @SpringBootApplication 状态
许多 Spring Boot 开发人员总是对他们的主类进行注解 与
@Configuration、@EnableAutoConfiguration和@ComponentScan。 由于这些注释经常一起使用(尤其是如果 你遵循上面的最佳实践),Spring Boot 提供了一个 方便@SpringBootApplication替代。
@SpringBootApplication注解等价于使用@Configuration、@EnableAutoConfiguration和@ComponentScan与他们的 默认属性:[...]
@ComponentScan javadoc 声明的位置
如果没有定义特定的包,扫描将从 声明此注解的类的包。
也就是说,只会扫描与您的ReadingListApplication 在同一包中的类型。
如果您需要自定义配置,请酌情提供您自己的@Configuration、@EnableAutoConfiguration 和@ComponentScan。
【讨论】:
@ComponentScan 不仅如此,而且实际上是 SpringBoot 2.X.X 的@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) 。所以请注意,如果您将 @SpringBootApplication 替换为您自己的个人配置
在设置Spring boot 项目时,让您的应用程序类(在基础包中包含@SpringBootApplication 注释的类。
@SpringBootApplication 所做的其中一件事是组件扫描。但是,它只扫描子包。即,如果您将该类放在 com.mypackage 中,那么它将扫描子包中的所有类,即 com.mypackage.*。
如果您不想这样做,您还可以将@ComponentScan 添加到指定根包的类中,即@ComponentScan("com.mypackage")
我建议你有一个基础包,即 com.mypackage。在这些包中,有你的子包。您的类是否包含该基础包中的@SpringBootApplication。
【讨论】:
查看 Spring 文档:
您可以使用@SpringBootApplication 覆盖组件扫描的默认值。您只需将其作为参数包括在内:
@SpringBootApplication(scanBasePackages = "entertainment")
或字符串数组:
@SpringBootApplication(scanBasePackages = {"entertainment", "readinglist"})
【讨论】:
我遇到了同样的问题,为了解决这个问题,我像这样重命名了我的包。
“com.project”
你可以在那里放置你的 SpringBootAplication 主类,然后创建以“com.project”开头的其他包
“com.project.dao”
“com.project.controller”
创建这个子项目结构你不需要在@SpringBootApplication注解中使用scanBasePackages,这样做你的主类将能够找到你项目中的每个组件。
如果您选择使用 scanBasePackages,请记住您需要像这样设置所有组件包。
@SpringBootApplication(scanBasePackages = {"com.project.dao", "com.project.controller"})
【讨论】:
要使包扫描真正起作用,您必须执行以下操作。
@SpringBootApplication(scanBasePackages = {"com.your.package.test.*.*"})
第一个星号告诉您扫描主路径 (com.your.package.test) 中的所有包,第二个星号告诉您扫描每个包中的所有文件。
例如:
com.your.package.test
|_ config
|_ business
|_ controller
|_ domain
|_ repository
【讨论】: