Spring Boot应用启动时,被@RestController、@Service等注解标记的类作为单例Bean由IoC容器统一创建,其构造函数在Bean实例化阶段(即应用上下文刷新完成前)立即执行,并自动完成依赖注入。
spring boot应用启动时,被`@restcontroller`、`@service`等注解标记的类作为单例bean由ioc容器统一创建,其构造函数在bean实例化阶段(即应用上下文刷新完成前)立即执行,并自动完成依赖注入。
在Spring Boot中,只要一个类被标注为@RestController、@Service、@Component或@Configuration等Spring托管注解,它就会被纳入IoC容器管理,成为Spring Bean。这类Bean默认作用域为singleton,即整个应用生命周期内仅创建一个实例,而该实例的创建时机正是应用启动过程中的上下文刷新阶段(ApplicationContext refresh phase)。
以您提供的MessageController为例:
@RestController
@RequestMapping("/api/v1")
public class MessageController {
private final RabbitMQProducer producer; // 建议使用final修饰,保证不可变性
public MessageController(RabbitMQProducer producer) {
this.producer = producer; // 构造函数在此处执行
System.out.println("MessageController constructor executed!");
}
@GetMapping("/publish")
public ResponseEntity<String> sendMessage(@RequestParam("message") String message) {
producer.sendMessage(message);
return ResponseEntity.ok("message sent to the rabbitmq");
}
}当Spring Boot应用启动(如调用SpringApplication.run()),容器会按依赖顺序扫描并实例化所有候选Bean。由于MessageController依赖RabbitMQProducer,Spring会先创建RabbitMQProducer Bean(若尚未存在),再将其作为参数传入MessageController的构造函数——此时构造函数体被执行,完成属性赋值与初始化逻辑。
✅ 关键要点总结:
- 构造函数执行发生在应用启动期,而非首次HTTP请求时;
- 依赖注入(DI)由Spring容器自动完成,无需手动new对象;
- 若构造函数参数对应的Bean未定义或存在多个候选(且未加@Primary/@Qualifier),启动将失败并抛出NoSuchBeanDefinitionException或NoUniqueBeanDefinitionException;
- 推荐将依赖字段声明为final,配合构造器注入,既保障线程安全,又符合不可变设计原则;
- 如需延迟初始化(避免启动耗时),可对Bean添加@Lazy注解(但需谨慎评估对功能的影响)。
因此,理解构造函数执行时机,本质是理解Spring Bean生命周期的第一步:实例化 → 依赖注入 → 初始化回调(如@PostConstruct)→ 可用。掌握这一流程,有助于合理设计组件初始化逻辑、排查启动异常及优化应用冷启动性能。


















