我有一个具有以下结构的Spring Boot应用程序

com.package
   Application - annotated with @SpringBootApplication
   Configuration - annotated with @Configuration
   Component1 - annotated with @Component, constructor annotated with @Autowired
com.package.subpackage
   Component2 - annotated with @Component, constructor annotated with @Autowired

我的应用程序类是
package com.package;

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

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

当我启动该应用程序时,Component1Component2都被标识为候选组件。但是,仅Component1实例化。
Component2仅在进行以下任一更改时实例化
  • 我将其移至com.package,即与Component1相同
  • 我在@Autowired
  • 中将其声明为com.package.Configuration字段

    为什么在这种情况下,Spring Boot会发现该组件而不实例化该组件?在发现和实例化@ComponentScan方面@Component的工作方式是否有所不同?

    最佳答案

    就我而言,Spring Boot本身不是问题。
    @PostConstructComponent1方法阻塞了主线程,因此Component2未初始化。

    使用@Autowired或移至相同的软件包显然会在@PostConstruct之前触发Component2Component1方法。

    09-30 14:50