Spring Bean构造方法在实例化阶段调用:默认单例Bean于应用启动时容器refresh()过程中执行一次;prototype Bean每次getBean()时执行;request/session等作用域则按对应生命周期首次获取时执行。

Spring 容器中 Bean 的构造方法在Bean 实例化阶段被调用,也就是容器创建该 Bean 对象时——这个时间点取决于 Bean 的作用域和容器启动流程,而不是每次使用时。
默认单例 Bean:应用启动时立即执行
对于加了 @Service、@RestController、@Component 或 @Configuration 等注解的类(未显式指定 @Scope),Spring 默认按 singleton 作用域管理。这类 Bean 的构造方法会在:
- ApplicationContext 刷新(
refresh())过程中、上下文初始化完成前被调用 - 所有 BeanDefinition 加载并解析完毕后,容器批量创建单例实例时触发
- 只要应用成功启动,就一定已执行,且仅执行一次
原型(prototype)Bean:每次获取时才执行
若 Bean 显式声明为 @Scope("prototype"),则构造方法不会在启动时调用,而是在每次调用 applicationContext.getBean(XXX.class) 或发生依赖注入时才执行:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 每次请求都新建对象,每次都会调用构造方法
- 不参与启动时的预实例化,也不会被提前放入单例池
- 适合有状态、需隔离实例的场景(如临时任务处理器)
其他作用域的触发时机
Web 相关作用域(如 request、session、application)的构造方法调用时机与对应生命周期绑定:
立即学习“Java免费学习笔记(深入)”;
-
request:每个 HTTP 请求首次访问该 Bean 时调用构造方法 -
session:当前用户会话中第一次获取该 Bean 时调用 -
application:整个 ServletContext 初始化完成后、首次获取时调用(全局单例,但晚于容器启动初期)
构造方法调用的前提条件
构造方法能被成功调用,还需满足几个底层前提:
- 类已被 ClassLoader 加载为 JVM 中的
Class对象 - Spring 已通过注解扫描或配置解析生成对应的
BeanDefinition - 容器能根据参数匹配策略(如构造器参数类型、
@Autowired标记)选定唯一构造器 - 若含多个构造器且无明确指示,Spring 会优先选择参数最多、且所有参数都能被容器满足的那个

















