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

