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

为什么Spring字段注入会引发NullPointerException?

字段注入导致手动new实例空指针的原因分析

核心逻辑:Spring依赖注入仅作用于容器管理的Bean

不管是字段注入、setter注入还是构造器注入,Spring的自动注入逻辑只在容器创建Bean的生命周期流程中执行,脱离容器管控的对象无法享受自动注入。

字段注入的本质与局限

  • 字段注入(比如用@Autowired标注私有字段)是Spring通过反射机制绕过字段的访问权限限制,直接给字段赋值。但这个反射赋值的动作,只有当Spring容器初始化该类的Bean时才会触发。
  • 当你手动new OrderServiceImpl()时,这个对象完全不在Spring容器的管控范围内,Spring根本不会感知到这个对象的存在,自然不会执行任何注入操作,所以memberRepository字段始终是null,调用createOrder方法时就会抛出NullPointerException。

setter注入能正常运行的原因

添加setter方法后,你手动new出实例时,可以主动调用setter方法把memberRepository实例传入,这相当于你自己手动完成了依赖注入的动作,和Spring容器无关,因此字段能被正确赋值,方法可以正常执行。

额外提示

字段注入的强依赖性导致它只适合完全由Spring管理的Bean场景。如果你的类存在需要手动实例化的可能(比如单元测试、非Spring管控的业务代码),构造器注入或setter注入会是更稳妥的选择——它们不依赖容器,能在非容器环境下手动完成依赖装配。

内容的提问来源于stack exchange,提问作者김유담

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:13:11