Spring spring

Spring中文网站 > Spring Batch > Spring注入方式有哪些 Spring如何给静态变量注入属性
Spring注入方式有哪些 Spring如何给静态变量注入属性
发布时间:2026/09/20 16:32:36

品牌型号:联想ThinkPad X1

系统:Windows10家庭版

软件版本:Spring 5.3.7

我们在学Spring的时候,经常会遇到依赖注入,很多人刚开始接触的是常见的那几种注入方式,用着没问题,但是没有真正去理解这几种注入方式背后的差异和使用场景,在项目开发的时候踩过几次坑后才能慢慢搞清楚。还有个问题在实际开发中出现的几率很多,很多人在开发的时候都好奇静态变量能不能用Spring注入?直接加@Autowired发现不生效,这是为什么?下面给大家介绍一下Spring注入方式有哪些,Spring如何给静态变量注入属性的相关内容。

一、Spring注入方式有哪些

Spring的依赖注入方式主要有三种,可以通过构造器实现注入,也可以通过Setter或者字段进行注入。这三种方式各有特点,使用场景也大不相同,构造器注入是通过类的构造方法来完成依赖的传入,我们把需要注入的依赖作为构造方法的参数,Spring在创建Bean的时候会自动把对应的依赖传进去,依赖在对象创建时就已经就位,不存在依赖为空的风险,构造器注入方便我们平时做单元测试,只需要new一个对象把依赖传进去就行,不需要启动Spring容器。

演示构造器注入
图1:演示构造器注入

我们在类中写setter方法也可以实现依赖注入,在对应的setter方法上加@Autowired注解,Spring会在Bean创建完成之后调用这些方法完成注入,这种方式的灵活性要比构造器注入高,适合处理那些不注入也能正常运行、注入了功能更完整的依赖。

setter方法注入
图2:setter方法注入

字段注入比构造器和setter方法要简洁得多,直接在类的成员变量上加@Autowired注解,Spring会通过反射完成注入,不需要写构造方法也不需要写setter。代码写起来很简单,日常开发中使用频率也很高。但是依赖关系不够透明,而且对单元测试不够友好,脱离Spring容器之后字段值会是null,需要借助额外的工具才能在测试中处理。

字段注入
图3:字段注入

二、Spring如何给静态变量注入属性

应该有很多人直接在静态变量上加@Autowired运行时发现变量始终是null,这是因为Spring的注入机制本身就不支持直接注入静态变量,静态变量属于类本身不属于某个具体的实例,而Spring管理的就是Bean的实例,注入操作是在实例层面完成的。静态变量在类加载的时候就已经存在,这个时候Spring容器还没有完成初始化,所以当然就没法完成注入了。

错误实例
图4:错误实例

要解决这个问题,我们工作中常用的方式就是通过非静态的setter方法间接来完成注入,保留静态变量本身,然后写一个非静态的setter方法,在这个setter方法上加@Autowired注解,方法内部把注入进来的值赋给静态变量。Spring会正常调用这个setter方法完成注入,静态变量也就拿到了对应的值。

通过非静态setter方法间接完成注入
图5:通过非静态setter方法间接完成注入

也可以在类中声明一个非静态的初始化方法,然后在方法上加个@PostConstruct注解,Spring在完成Bean初始化之后会自动调用这个方法,在方法内部把已经注入的非静态成员变量赋值给对应的静态变量,也能达到同样的效果。这种方式适合需要在初始化阶段做一些额外处理的场景。

使用@PostConstruct注解
图6:使用@PostConstruct注解

以上就是Spring注入方式有哪些,Spring如何给静态变量注入属性的全部内容了。我们理清楚Spring是在实例层面完成注入的,就知道静态变量为什么不能直接注入了,Spring的三种注入方式使用场景不同,构造器注入推荐在依赖明确的情况下使用,字段注入写起来省事但是有点不方便测试,Setter注入在处理可选依赖时灵活性更好。

180 1563 6924