【问题标题】:Scan all beans as if they were in the current package in Spring?扫描所有 bean,就好像它们在 Spring 中的当前包中一样?
【发布时间】:2016-09-02 17:59:36
【问题描述】:

我有一个 Spring Boot 父项目,我将其用作特定于客户的扩展项目的依赖项。最初,为了确保其他一切正常工作,我将客户项目的基础包设置为与父项目相同,并且一切都按预期工作。但是,将 Application 类添加到子包后,我开始收到有关缺少 bean 和组件的异常。

例如,父项目具有基础包 com.example.parent,客户项目具有基础包 com.example.parent.customerA。起初,没有一个父 bean 被拾取,所以我添加了@ComponentScan("com.example.parent")。然后我得到一个关于缺少存储库 bean 的异常,所以我添加了@EnableJpaRepositories("com.example.parent")。然后我得到一个关于缺少实体的异常,所以我添加了@EntityScan("com.example.parent"),现在它的运行就像客户项目与父项目具有相同的包时一样。

有没有更简洁的方法来加载所有父项目的 bean 和组件?我宁愿有一种方法来配置客户项目,以便加载父项目中的所有内容,就好像客户项目具有相同的基础包。我担心如果我必须为 jpa 存储库和实体添加这些特定的注释,我可能不会用将来可能添加的某种其他 Spring 对象来覆盖我的所有基础。

【问题讨论】:

  • @ComponentScan(basePackages = {"com.example.parent"}) 应该扫描此包及其子包中的所有组件(控制器、存储库、服务)。你可以发布你的配置类
  • 它没有获取 repos 和实体
  • 请发布您的配置类。请粘贴我为组件扫描编写的代码。实体用于在数据库中持久化,它们的扫描应该在 hibernate 或 JPA 配置类中设置

标签: java spring spring-mvc spring-boot spring-data-jpa


【解决方案1】:

Alex 提到了更简洁的方法。但是如果你真的需要你的spring boot应用驻留在一个子包中,你可以在@SpringBootApplication中定义基础包,如下所示。

package com.example.parent.customer


@SpringBootApplication(scanBasePackages={"com.example.parent"})
public class SpringBootApp {
//main method
}

这样,不同的项目可以共享通用的spring bean,并在其子包中拥有特定的组件。

【讨论】:

    【解决方案2】:

    对我来说最干净的方法是让我的 spring boot 应用程序驻留在我希望被发现的所有 bean 的根目录中(也就是 com.example.parent 甚至 com.example 如果适用)。所以,在你的情况下,我会

    package com.example.parent //or com.example
    
    @SpringBootApplication
    public class SpringBootApp {
        //main method
    }
    

    默认情况下,将拾取当前包和子包中的所有内容。这是因为@SpringBootApplication 已经定义了一个@ComponentScan,没有参数,默认为当前包。

    Spring's documentation:

    我们通常建议您将主应用程序类定位在 其他类之上的根包。 @EnableAutoConfiguration 注释通常放在您的主类上,并且隐含 为某些项目定义了一个基本的“搜索包”。例如,如果您 正在编写一个 JPA 应用程序,它的包 @EnableAutoConfiguration 注解的类将用于搜索 @Entity 项目。

    使用根包还允许@ComponentScan 注解 无需指定 basePackage 属性即可使用。你也可以 如果您的主类位于 根包。

    【讨论】:

    • 谢谢,这就是我最终要做的。我认为为每个客户项目提供一个单独的 Spring Boot 应用程序类可能会有好处,但我认为这没有意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多