繁体   English   中英

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

[英]Scan all beans as if they were in the current package in Spring?

我有一个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 repos和实体添加这些特定的注释,我可能没有覆盖所有可能在将来添加的其他Spring对象的基础。

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

package com.example.parent.customer


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

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

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

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

@SpringBootApplication
public class SpringBootApp {
    //main method
}

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

Spring的文档

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

使用根包还允许使用@ComponentScan批注,而无需指定basePackage属性。 如果主类位于根包中,也可以使用@SpringBootApplication批注。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM