You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring框架中使用Autowired时,类对象的创建时机是什么?

Spring中@Autowired注入类的对象创建时机详解

嘿,这个问题问到点子上了!Spring里被@Autowired注入的类对象,创建时机其实和Bean的作用域以及是否开启懒加载直接相关,下面我给你掰扯清楚:

1. 默认单例(Singleton)作用域(最常见)

这是Spring Bean的默认作用域,大部分你用@Component、@Service、@Repository这些注解标记的类,默认都是单例。

  • 非懒加载(默认):Spring容器启动初始化阶段就会创建这个Bean的实例,并且把它存在容器的单例池中。后续所有@Autowired注入的,都是这个已经创建好的实例。
  • 懒加载(加@Lazy注解):这时候Bean不会在容器启动时创建,而是第一次被@Autowired注入,或者第一次通过ApplicationContext获取的时候,才会实例化这个Bean。

举个简单例子:

// 非懒加载单例,容器启动就创建
@Service
public class UserService { ... }

// 懒加载单例,第一次注入时才创建
@Service
@Lazy
public class OrderService { ... }

2. 原型(Prototype)作用域

如果给Bean标记了@Scope("prototype"),那它的创建时机就完全不一样了:

  • 每次@Autowired注入这个Bean的时候,Spring都会新创建一个实例给你;
  • 每次通过ApplicationContext.getBean()获取这个Bean时,也会新创建实例。

简单说就是:用一次,建一次,容器不会缓存原型Bean的实例。

3. 其他特殊作用域(Web环境专属)

这些是Spring Web环境下的特殊作用域:

  • Request作用域:每次HTTP请求进来时,创建一个新的Bean实例,请求结束后销毁;
  • Session作用域:每个用户会话(Session)创建一个Bean实例,会话过期后销毁。
    @Autowired注入这些作用域的Bean时,Spring会根据当前的请求/会话上下文,提供对应的实例。

总结一下核心逻辑:Spring会根据Bean的作用域规则,提前或按需创建实例,@Autowired只是把已经创建好(或者按需创建好)的实例注入到目标类中,注入本身不负责创建对象,创建时机由Bean的作用域和懒加载配置决定。

内容的提问来源于stack exchange,提问作者Ravi_Jaiswal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:20:30