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

Java Spring Boot 构造方法依赖注入实际运行机制相关问题咨询

Spring 构造方法依赖注入问题解答

无手动传参/初始化时的注入逻辑

整个构造注入的流程完全由 Spring 底层自动处理,不需要开发者手动实例化类或传入参数:

  • Spring 启动阶段会扫描所有标注了 @Controller、@Service、@Repository、@Component 注解的类,将这些类标记为 Spring IoC 容器托管的 Bean
  • 实例化目标类时,Spring 会先解析它的构造方法:如果类仅存在一个带参构造方法,Spring 会自动在容器中查找和构造参数类型匹配、已完成初始化的 Bean 作为入参传入,调用构造方法完成目标类的实例化
  • 如果找不到匹配的参数 Bean,Spring 会在启动阶段直接抛出异常,不会完成目标类的实例化

堆内存中的实例分布

被构造的类与其依赖是 两个完全独立的对象实例:

  • 依赖类(示例中的 SomeRepository)会先完成实例化,作为单独的 Bean 存储在堆内存中
  • 目标类(示例中的 SampleController)是另一个独立的 Bean 实例,它内部的 someRepository 字段仅存储依赖实例的内存引用,二者不会合并为同一个实例
  • 默认单例模式下,整个 Spring 容器中每个类型只会存在一个实例,所有依赖该类型的 Bean 都会持有同一个引用

示例代码参数判空逻辑说明

你代码中的 someRepository 正常情况下不可能为 null:如果 SomeRepository 已经被 Spring 正确托管,容器会自动传入实例;如果找不到匹配的 Bean,Spring 会直接在启动阶段报错,根本不会执行到构造方法内的判空逻辑,你写的异常抛出逻辑几乎没有触发的可能。

示例代码

@Controller
@RequestMapping
public class SampleController{

    private final SomeRepository someRepository;

    public SampleController(SomeRepository someRepository) throws Exception{

        // someRepository 会有可能为null吗?
        if(someRepository == null)
            throw new Exception("I told you it wouldn't work!");
        this.someRepository = someRepository;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:57:00