扫描所有bean,就好像它们在Spring的当前包中一样?

时间:2016-09-02 17:59:36

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

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

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

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

2 个答案:

答案 0 :(得分:4)

亚历克斯提到的清洁方法。但是,如果您确实需要将Spring启动应用程序驻留在子包中,则可以在@SpringBootApplication中定义基本包,如下所示。

package com.example.parent.customer


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

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

答案 1 :(得分:3)

对我来说最干净的方法是让我的spring boot应用程序驻留在我希望被发现的所有bean的根目录下(如果适用的话,请注意{。{1}}或com.example.parent)。所以,在你的情况下,我会有

com.example

默认情况下,将拾取当前包和子包中的所有内容。这是有效的,因为package com.example.parent //or com.example @SpringBootApplication public class SpringBootApp { //main method } 已经定义了@SpringBootApplication,没有args,默认为当前包。

Spring's documentation

  

我们通常建议您找到主应用程序类   其他类上面的根包。 @EnableAutoConfiguration   注释通常放在您的主类上,并且它是隐式的   为某些项目定义基础“搜索包”。例如,如果你   正在写一个JPA应用程序,包的   将使用@EnableAutoConfiguration注释类进行搜索   @Entity项目。

     

使用根包也允许@ComponentScan注释   无需指定basePackage属性即可使用。你也可以   如果您的主类在。中,请使用@SpringBootApplication批注   根包。