我有一个具有以下结构的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);
}
}
当我启动该应用程序时,
Component1
和Component2
都被标识为候选组件。但是,仅Component1
实例化。Component2
仅在进行以下任一更改时实例化com.package
,即与Component1
相同@Autowired
com.package.Configuration
字段为什么在这种情况下,Spring Boot会发现该组件而不实例化该组件?在发现和实例化
@ComponentScan
方面@Component
的工作方式是否有所不同? 最佳答案
就我而言,Spring Boot本身不是问题。@PostConstruct
的Component1
方法阻塞了主线程,因此Component2
未初始化。
使用@Autowired
或移至相同的软件包显然会在@PostConstruct
之前触发Component2
的Component1
方法。