![](/img/trans.png)
[英]Spring : Does <context:component-scan /> instantiate all beans defined in the base package?
[英]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,默认为当前包。
我们通常建议您将主应用程序类放在其他类之上的根包中 。 @EnableAutoConfiguration注释通常放在您的主类上,它隐式地为某些项定义了一个基础“搜索包”。 例如,如果您正在编写JPA应用程序,则@EnableAutoConfiguration注释类的包将用于搜索@Entity项。
使用根包还允许使用@ComponentScan批注,而无需指定basePackage属性。 如果主类位于根包中,也可以使用@SpringBootApplication批注。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.