我有一个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对象的所有基础。
答案 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,默认为当前包。
我们通常建议您找到主应用程序类 其他类上面的根包。 @EnableAutoConfiguration 注释通常放在您的主类上,并且它是隐式的 为某些项目定义基础“搜索包”。例如,如果你 正在写一个JPA应用程序,包的 将使用@EnableAutoConfiguration注释类进行搜索 @Entity项目。
使用根包也允许@ComponentScan注释 无需指定basePackage属性即可使用。你也可以 如果您的主类在。中,请使用@SpringBootApplication批注 根包。