Spring Boot不扫描组件和配置

Muk*_*and 4 autowired spring-boot

我有一个多模块项目:

TOP_LEVEL
|-> core
|-> assetManager
'-> requestManager
Run Code Online (Sandbox Code Playgroud)

所以,我有一个核心模块,核心模块中有 Application 类。

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

应用程序主类位于com.test.companydomain.core核心模块的 package: 中。该应用程序类注释为

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

}
Run Code Online (Sandbox Code Playgroud)

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

注释为:

@Slf4j
@Configuration
@Component("clientUtils")
Run Code Online (Sandbox Code Playgroud)

我在此类中创建了一些 bean,它使用其他配置类来自动装配和创建 bean。

到目前为止,Bean 尚未从此 ClientUtils 类生成。

这可能有什么问题?

我看到的错误是

应用程序无法启动


描述:

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.
Run Code Online (Sandbox Code Playgroud)

这个类LocationService也用@Component注解,以便spring创建它的bean。

Ana*_*han 5

在您的应用程序中,主类存在于包中com.test.companydomain.core,并且默认情况下 springboot 会扫描主应用程序当前包下的所有类和包以查找自动装配 bean。所以,你已经提供了注解@ComponentScan来明确告诉spring也扫描其他包。但是你的util类在包中com.test.domain.assetManager.server.common.utils,它没有包含在@ComponentScan注解中,所以它不会被组件扫描占用。

您可以尝试将包 com.test.domain 添加到主类中的组件扫描中,例如:

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

}
Run Code Online (Sandbox Code Playgroud)


Evg*_*yst 5

如果您使用 Spring Boot,您应该考虑使用@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);
  }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,Spring Boot仅扫描带有注释的类的包@SpringBootApplication及其子包。

此外,@Configuration使用 元注释@Component,因此@Configuration类是组件扫描的候选者,不应使用 显式注释@Component

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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

@Component
public class LocationService {
  //...
}
Run Code Online (Sandbox Code Playgroud)