Spring 启动时不扫描组件和配置

Spring boot not scanning components and configurations

我有一个多模块项目:

TOP_LEVEL
|-> core
|-> assetManager
'-> requestManager

所以,我有一个核心模块,在核心模块中有应用程序 class。

在我的 assetManger build.gradle 我 compile(project(:core))

应用程序 main class 位于核心模块的包 : com.test.companydomain.core 中。 此应用程序 class 带有

注释
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.test.companydomain"})
@EntityScan(basePackages = {"com.test.companydomain", "com.test.companydomain.assetManager"})
@EnableJpaRepositories
class Application {

}

包中的 assetManager 模块中有一个 class ClientUtils : com.test.domain.assetManager.server.common.utils;

注释为:

@Slf4j
@Configuration
@Component("clientUtils")

我在这个 class 中创建了 bean,它使用其他配置 classes 来自动装配和创建 bean。

目前尚未从该 ClientUtils class 生成 bean。

这可能是什么问题?

我看到的错误是

应用程序启动失败


描述:

Field locationService in com.test.companydomain.assetManager.server.vendor.converter.ExternalVendorPojoConversionHelper required a bean of type 
'com.test.companydomain.assetManager.server.common.utils.client.LocationService' that could not be found.

此 class LocationService 也使用 @Component 进行注释,以便 spring 创建其 bean。

在您的应用程序中,主要 class 存在于包 com.test.companydomain.core 中,默认情况下 springboot 扫描当前包下的所有 classes 和包自动装配 bean 的主要应用程序。因此,您提供了注释 @ComponentScan 以明确告诉 spring 扫描其他包,因为 well.But 您的 util class 在包 com.test.domain.assetManager.server.common.utils 中, 不包含在 @ComponentScan 注释中,因此不会被组件扫描占用。

您能否尝试将包 com.test.domain 添加到主 class 中的组件扫描中,例如:

@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.test.companydomain","com.test.domain"})
@EntityScan(basePackages = {"com.test.companydomain", "com.test.companydomain.assetManager","com.test.domain"})
@EnableJpaRepositories
class Application {

}

如果您正在使用 Spring 引导,您应该考虑使用 @SpringBootApplication 注释并配置基础包以使用 scanBasePackages 而不是 @ComponentScan 进行扫描:

package com.test.companydomain.core;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages = "com.test.companydomain")
@EntityScan({"com.test.companydomain", "com.test.companydomain.assetManager"})
public class Application {

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

默认情况下,Spring 引导仅扫描 class 注释的包 @SpringBootApplication 及其子包。

此外,@Configuration 是用 @Component 进行元注释的,因此 @Configuration class 是组件扫描的候选对象,不应使用 [=18] 显式注释=]:

package com.test.domain.assetManager.server.common.utils;

@Configuration
public class ClientUtils {

  @Autowired
  private ClientProperties properties;

  @Bean
  public TestClient testClient() {
    return new TestClient(properties); //example
  }
}

package com.test.companydomain.assetManager.server.common.utils.client;

@Component
public class LocationService {
  //...
}