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

Spring Boot对象创建问题咨询:Autowired、new及Setter注入时机

Spring Boot 对象创建相关问题解答

1. Autowired注入+手动new Service时的对象数量

  • Spring默认会给标记了@Service的类创建1个单例对象(未修改Bean作用域的前提下),这个就是@Autowired注入的实例。
  • 手动通过new Service()创建的对象完全脱离Spring容器管理,每调用一次new就会生成一个新对象。
  • 总数计算:Spring容器创建的1个单例 + 手动new的次数对应的对象数。比如只new一次,总共2个对象。

2. Setter注入的对象创建时机

  • 默认单例(singleton)作用域下:不管用哪种注入方式(构造器/Setter/字段),单例Bean都是在Spring容器启动初始化上下文时就完成创建和依赖注入,不是等到需要时才创建。
  • 原型(prototype)作用域下:每次获取Bean(比如注入、调用getBean())时才会创建新对象,Setter注入的操作也会在这个时候触发。

3. Spring Boot 创建对象的核心方式梳理

容器管理的Bean创建方式

  • 组件扫描注解:用@Component、@Service、@Controller、@Repository标记类,Spring会自动扫描并创建单例Bean(默认作用域)。
  • 配置类@Bean方法:在@Configuration标记的配置类中,用@Bean注解方法,方法返回值就是Spring要管理的Bean,可自定义创建逻辑。
  • 导入方式:用@Import导入其他配置类或普通类,让Spring将其纳入容器管理并创建Bean。
  • FactoryBean接口:实现FactoryBean接口自定义Bean的创建流程,适合复杂对象的实例化场景。

依赖注入的本质(Spring创建后注入)

依赖注入只是Spring将已创建好的Bean注入到目标对象中,不是创建对象的方式,常见注入方式:

  • 构造器注入:官方推荐,通过构造方法传入依赖,保证依赖不可变。
  • Setter注入:通过setter方法注入,适合可选依赖。
  • 字段注入:直接在字段上用@Autowired,简单但不利于单元测试,不推荐使用。

脱离容器的对象创建

直接用new关键字创建的对象,不属于Spring容器管理,Spring不会对其进行依赖注入、AOP代理、生命周期回调等处理,就是普通Java对象。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:52:07