【问题标题】:Configuration using annotation @SpringBootApplication使用注解@SpringBootApplication 进行配置
【发布时间】:2016-02-10 17:07:01
【问题描述】:

我的 Spring Boot 配置有问题。

我已经使用https://start.spring.io/创建了基础 Spring Boot 项目

我有一个问题,配置仅适用于子目录中的类:

我尝试过注释@ComponentScan,但没有帮助。

你知道我能用这个做什么吗?

【问题讨论】:

    标签: java spring gradle spring-boot


    【解决方案1】:

    Spring Boot documentation for @SpringBootApplication 状态

    许多 Spring Boot 开发人员总是对他们的主类进行注解 与@Configuration@EnableAutoConfiguration@ComponentScan。 由于这些注释经常一起使用(尤其是如果 你遵循上面的最佳实践),Spring Boot 提供了一个 方便@SpringBootApplication 替代。

    @SpringBootApplication注解等价于使用 @Configuration@EnableAutoConfiguration@ComponentScan 与他们的 默认属性:[...]

    @ComponentScan javadoc 声明的位置

    如果没有定义特定的包,扫描将从 声明此注解的类的包。

    也就是说,只会扫描与您的ReadingListApplication 在同一包中的类型。

    如果您需要自定义配置,请酌情提供您自己的@Configuration@EnableAutoConfiguration@ComponentScan

    【讨论】:

    • 如果我添加了另一个 spring boot 应用程序作为 mvn 依赖项,然后我希望我的父应用程序扫描这个库呢?
    • “也就是说,只会扫描与你的 ReadingListApplication 在同一个包中的类型。”这正是我要找的,谢谢。我不仅想知道什么,但是为什么。
    • 只是想补充一点,您可能需要注意@SpringBootApplication 如何配置每个注解,因为它很重要。例如,@ComponentScan 不仅如此,而且实际上是 SpringBoot 2.X.X 的@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) 。所以请注意,如果您将 @SpringBootApplication 替换为您自己的个人配置
    【解决方案2】:

    在设置Spring boot 项目时,让您的应用程序类(在基础包中包含@SpringBootApplication 注释的类。

    @SpringBootApplication 所做的其中一件事是组件扫描。但是,它只扫描子包。即,如果您将该类放在 com.mypackage 中,那么它将扫描子包中的所有类,即 com.mypackage.*。

    如果您不想这样做,您还可以将@ComponentScan 添加到指定根包的类中,即@ComponentScan("com.mypackage")

    我建议你有一个基础包,即 com.mypackage。在这些包中,有你的子包。您的类是否包含该基础包中的@SpringBootApplication

    【讨论】:

    • 我会按照你所说的那样做,父包带有配置类,子包带有我的应用程序代码。谢谢。
    【解决方案3】:

    查看 Spring 文档:

    http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/SpringBootApplication.html

    您可以使用@SpringBootApplication 覆盖组件扫描的默认值。您只需将其作为参数包括在内:

    @SpringBootApplication(scanBasePackages = "entertainment")

    或字符串数​​组:

    @SpringBootApplication(scanBasePackages = {"entertainment", "readinglist"})

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,为了解决这个问题,我像这样重命名了我的包。

      “com.project”

      你可以在那里放置你的 SpringBootAplication 主类,然后创建以“com.project”开头的其他包

      “com.project.dao”

      “com.project.controller”

      创建这个子项目结构你不需要在@SpringBootApplication注解中使用scanBasePackages,这样做你的主类将能够找到你项目中的每个组件。

      如果您选择使用 scanBasePackages,请记住您需要像这样设置所有组件包

      @SpringBootApplication(scanBasePackages = {"com.project.dao", "com.project.controller"})

      【讨论】:

        【解决方案5】:

        要使包扫描真正起作用,您必须执行以下操作。

        @SpringBootApplication(scanBasePackages = {"com.your.package.test.*.*"})
        

        第一个星号告诉您扫描主路径 (com.your.package.test) 中的所有包,第二个星号告诉您扫描每个包中的所有文件。

        例如:

        com.your.package.test
        |_ config
        |_ business
        |_ controller
        |_ domain
        |_ repository
        

        【讨论】:

        • 错误答案。你不需要给星号。只需指定基本包就足够了。它将递归地找到基础包中的子包。
        猜你喜欢
        • 2020-03-16
        • 1970-01-01
        • 2017-01-18
        • 1970-01-01
        • 1970-01-01
        • 2012-08-10
        • 1970-01-01
        • 2020-06-21
        • 1970-01-01
        相关资源
        最近更新 更多