跨 Java 个包自动装配 Spring 个 Bean

Autowired Spring Beans across Java packages

我正在尝试将我的项目分成三个模块:核心、管理和用户,以便我可以通过核心共享公共代码。问题是我无法 Spring 在不同的主包中获取自动装配的 bean,当我将所有东西都放在同一个包中时它可以工作。

在 com.mickeycorp.core 包中,我有我希望管理和用户模块使用的模型、服务等。在 com.mickeycorp.admin 中是我的 WebApplicationStarter(扩展 SpringBootServletInitializer),其中我有:

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
    ctx.register(SpringConfiguration.class);
    return application.sources(WebApplicationStarter.class);
}

我认为应该选择我的配置 class 我有以下内容:

@Configuration
@ComponentScan("com.mickeycorp")
public class SpringConfiguration {

}

显然我误解了什么。我认为设置 ComponentScan 会 Spring 扫描 com.mickeycorp 下的包以获取组件注释?

我走在正确的轨道上.. 添加 @ComponentScan 只是三分之一,而且是正确的,但它没有配置 Spring 来扫描其他类型 - 它只涵盖@Component @Repository@Service@Controller 注释。我必须将以下内容添加到 pickup @Entity@Repository:

@EntityScan("com.mickeycorp.core")
@EnableJpaRepositories("com.mickeycorp.core")

在这种情况下也不需要覆盖 SpringApplicationBuilder,因为 SpringConfiguration class 会自动拾取。

参考文献:

Spring Docs: Entity Scan

Spring Docs: EnableJpaRepositories

必须使用

@ComponentScan 注释。

请参考 Spring documentation

Either basePackageClasses() or basePackages() (or its alias value()) may be specified to define specific packages to scan.

@ComponentScan(basePackages={"package1","package2"})