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

