Java 扫描所有bean,就像它们在春季的当前包中一样?

Java 扫描所有bean,就像它们在春季的当前包中一样?,java,spring,spring-mvc,spring-boot,spring-data-jpa,Java,Spring,Spring Mvc,Spring Boot,Spring Data Jpa,我有一个springboot父项目,我使用它作为特定于客户的扩展项目的依赖项。最初,为了确保其他一切正常工作,我将客户项目的基本包设置为与父项目相同,并且一切都按预期工作。然而,一旦我将应用程序类添加到一个子包中,我就开始出现关于缺少bean和组件的异常 例如,父项目具有基本包com.example.parent,而客户项目具有基本包com.example.parent.customerA。起初,没有任何父bean被拾取,所以我添加了@ComponentScan(“com.example.par

我有一个springboot父项目,我使用它作为特定于客户的扩展项目的依赖项。最初,为了确保其他一切正常工作,我将客户项目的基本包设置为与父项目相同,并且一切都按预期工作。然而,一旦我将应用程序类添加到一个子包中,我就开始出现关于缺少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对象覆盖我的所有基础。

对我来说,最干净的方法是让我的Spring boot应用程序驻留在我希望被发现的所有bean的根上(又称为
com.example.parent
或甚至
com.example
,如果适用的话)。所以,在你的情况下,我会

package com.example.parent //or com.example

@SpringBootApplication
public class SpringBootApp {
    //main method
}
默认情况下,将拾取当前包和子包中的所有内容。这是因为
@SpringBootApplication
已经定义了默认为当前包的
@ComponentScan
,没有参数

:

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

使用根包还可以创建@ComponentScan注释 无需指定basePackage属性即可使用。您还可以 如果主类位于中,请使用@SpringBootApplication注释 根包


Alex提到了更干净的方法,但是如果您真的需要spring boot应用程序驻留在子包中,您可以在@SpringBootApplication中定义基本包,如下所示

package com.example.parent.customer


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

通过这种方式,不同的项目可以共享公共的Springbean,并且在其子包中有特定的组件。

@ComponentScan(basePackages={“com.example.parent”})
应该扫描所有组件(控制器、存储库、服务)在这个包以及它的子包中。你能发布你的配置类吗?它没有获取repos和实体。请发布你的配置类。请粘贴我为组件扫描编写的代码。实体用于持久化数据库,它们的扫描应该在hibernate或JPA配置类中设置。这就是我最后要做的我认为为每个客户项目提供一个单独的spring boot应用程序类可能会有好处,但我不认为这有什么意义