为什么这个@ComponentScan在我的Spring Boot应用程序中不起作用?

时间:2019-04-18 17:20:46

标签: java spring-boot

我正在学习弹簧靴。这是我的Spring Boot项目结构。我确实有意将我的application.java放在其他软件包中,以了解@ComponentScan

项目源-https://github.com/kitkars/spring-boot

project structure

错误:

The application failed to start due to below error.

***************************
APPLICATION FAILED TO START
***************************

Description:

Field productRepository in com.test.service.ProductService required a bean of type 'com.test.repository.ProductRepository' that could not be found.

The injection point has the following annotations:
  - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.test.repository.ProductRepository' in your configuration.


Process finished with exit code 1

这是我的Application.java

@SpringBootApplication
@ComponentScan(basePackages = "com.test")
public class Application {

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

}

现在,如果我将Application.java移到com.test下,一切都会很好。

如果我的Application.java不在com.test下怎么办-它不能使用ComponentScan包并从那里开始吗?所有控制器,服务,存储库等都位于com.test下。

4 个答案:

答案 0 :(得分:2)

@SpringBootApplication注释的类应该在您的根包中(默认情况下,将扫描此包中的所有类和子包),或者您需要指定其他包(controllerentity和其他)在@ComponentScan中。

官方文档指出:

  

我们通常建议您将主应用程序类放在其他类之上的根包中。

答案 1 :(得分:0)

Spring Boot严重依赖默认配置。考虑来自@EnableAutoConfiguration批注的摘录。

  

带有注释的类的包   @EnableAutoConfiguration(通常通过@SpringBootApplication)具有   具体意义,通常用作“默认值”。例如,   扫描@Entity类时将使用它。一般   建议您放置@EnableAutoConfiguration(如果您不   在根包中使用@SpringBootApplication),以便所有   可以搜索子包和类。

相同的逻辑暗示@ComponentScan@EnableJpaRepositories和上面提到的@EntityScan注释。因此,如果要控制组件扫描,则应为所有这些注释显式指定基本软件包。

@SpringBootApplication(scanBasePackages = "com.test")
@EnableJpaRepositories(basePackages = "com.test")
@EntityScan(basePackages = "com.test")
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

还要注意,在您的情况下,无需使用其他@ComponentScan,因为您可以通过scanBasePackages属性为Spring Boot的@ComponentScan提供参数。

答案 2 :(得分:0)

如果有,请检查依赖项'org.springframework:spring-context-indexer。就我而言,该库导致子模块出现问题。 问题在于索引中仅包含当前gradle项目的bean。

答案 3 :(得分:-1)

You should remove @Repository in com/test/repository/ProductRepository.java.