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
相关产品推荐
相关产品推荐

