Java 扫描所有bean,就像它们在春季的当前包中一样?
我有一个springboot父项目,我使用它作为特定于客户的扩展项目的依赖项。最初,为了确保其他一切正常工作,我将客户项目的基本包设置为与父项目相同,并且一切都按预期工作。然而,一旦我将应用程序类添加到一个子包中,我就开始出现关于缺少bean和组件的异常 例如,父项目具有基本包com.example.parent,而客户项目具有基本包com.example.parent.customerA。起初,没有任何父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
@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应用程序类可能会有好处,但我不认为这有什么意义