bean的Spring Boot Autowiring在maven多模块项目中不起作用

Ani*_*eth 5 java spring maven spring-boot

在使用 spring boot 和 maven 将我们的项目模块化为不同的独立 maven 项目时,我们遇到了一个问题,即多模块 maven 项目中的 bean 自动装配不起作用。

只是为了给你一个问题的概述,以下是迄今为止开发的独立maven项目

  1. Coreservices – 包含整个应用程序的 spring boot 域对象:输出 JAR
  2. DBservices1-包含用于访问数据库的 spring boot 存储库和服务(数据库服务):输出 JAR
  3. Rewards - 包含 Rewards 模块相关文件(控制器、服务(业务逻辑服务)、视图):输出 JAR
  4. RewardsApp- 独立可部署的 maven 项目:输出 WAR

下面是依赖结构 RewardsApp-> Rewards -> DBservices1 -> Coreservices

问题是@Autowired在 Rewards 和 DBservices1 中使用的注释来获取用@Service/注释的映射服务@RepositoryRewardsAppProject中不可用。

作为一种解决方法,我们RewardsApp使用@Bean注释配置了 bean ,然后服务器可以使用这些服务以成功启动。使用这种方法,我们需要手动配置RewardsApp依赖项目中使用的所有 bean 。我们的应用程序中有许多服务和存储库,我们认为创建这样的 bean 不是一种正确的方式,因为需要创建许多 bean。

请注意,我们已经在 package 下的所有项目中创建了所有 spring boot 控制器、服务、存储库 com.company.application

下面是主类的片段:

@SpringBootApplication
@ComponentScan(basePackages = {"com.company.application"})
public class RewardsApp extends SpringBootServletInitializer {

  public static void main(String[] args) {
        SpringApplication.run(RewardsApp.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(RewardsApp.class);
    }
}

/**
*Manual beans in  RewardsApp
**/
@Bean
public SomeService someService()
{
    return new SomeService();
}
Run Code Online (Sandbox Code Playgroud)

Ani*_*eth 15

通过在 RewardsApp.java 中添加以下注释对我有用,现在自动装配适用于罐子内的类

@ComponentScan(basePackages = {"com.company"})
@EntityScan(basePackages = {"com.company"})
@EnableJpaRepositories(basePackages = {"com.company"})
Run Code Online (Sandbox Code Playgroud)

我猜上面是服务,实体(域),存储库


pap*_*y-o 5

为每个模块设置一个配置类(带有相关的 comp 扫描)并将这些配置导入到您的应用程序类中怎么样?

@SpringBootApplication
@ComponentScan(...)
@Import({RewardsContext.class, DBservicesContext.class})
...
Run Code Online (Sandbox Code Playgroud)

在此处导入文档