springboot中经常会用到properties文件中的配置,一般使用@Value注入,但是针对Utils工具类,需要注入一个静态变量有几种方法?为什么有的同学注入的值为null?

代码示例

如果直接使用@Value注入是什么结果?

/**
* the StaticInjectionUtils
*
* @author Java实用技术手册
* @date 2023-01-17
*/
@Component
public class StaticInjectionUtils { @Value("${normal.value}")
private String normalValue; @Value("${static.value}")
private static String staticValue; @PostConstruct
public void init() {
System.err.println("*** normalValue=" + normalValue);
System.err.println("*** staticValue=" + staticValue);
}
}
// 运行结果
//*** normalValue=normal --有结果
//*** staticValue=null --无结果

set注入(推荐)

@Component
public class StaticInjectionUtils { public static String staticValue; @Value("${static.value}")
public void setStaticValue(String staticValue) {
StaticInjectionUtils.staticValue = staticValue;
} @PostConstruct
public void init() {
System.err.println("*** staticValue=" + staticValue);
}
}
// *** staticValue=static
  • 注意点1:

    默认idea的提示set方法会带上static,将导致注入失败,比如
@Value("${static.value}")
public static void setStaticValue(String staticValue) {
StaticInjectionUtils.staticValue = staticValue;
}
  • 注意点2:

    静态变量不要用this引用,要用类名.变量,虽然你用this也能工作。
@Value("${static.value}")
public void setStaticValue(String staticValue) {
this.staticValue = staticValue;
}

至于为什么用this也能生效,知道的同学可以留言讨论~

  • 注意点3:

    方法名无所谓,你可以随便改,不信你试试。

PostConstruct注入

@Component
public class StaticInjectionUtils { @Value("${static.value}")
private String staticValue; public static String STATIC_VALUE2; @PostConstruct
public void init() {
STATIC_VALUE2 = this.staticValue;
System.err.println("*** staticValue=" + staticValue);
System.err.println("*** STATIC_VALUE2=" + STATIC_VALUE2);
}
}
*** staticValue=static
*** STATIC_VALUE2=static

这里使用了2个知识点:

  1. 利用普通@Value变量可以注入,提前完成配置的变量保存。
  2. 利用@PostConstruct在@Value之后执行,把普通变量赋值给静态变量。

这里回忆下springbean初始化顺序:方法和注解执行先后顺序为

Constructor -> @Autowired/Value -> @PostConstruct

利用上述原理,可以做很多有用的事情,比如类初始化工作一般专门会写一个init方法。

  • 注意点:

    staticValue不能声明为static
  • 这种方法要多定义一个无用变量,所以更推荐set注入。

set变体

@Component
public class StaticInjectionUtils { private static String staticValue; @Autowired
public void setStaticValue(@Value("${static.value}") String staticValue) {
System.out.println("set staticValue="+staticValue);
StaticInjectionUtils.staticValue = staticValue;
} @PostConstruct
public void init() {
System.err.println("*** staticValue=" + staticValue);
}
}

这也是set注入的一种变体,方法入参使用@Value注入,然后利用@Autowired,调用此方法注入给static变量。

  • 注意点:
  1. 方法不能有static修饰。
  2. 方法必须使用@Autowired注解。

以上就是本期内容,希望对你有帮助。

我是Pandas,专注Java编程实用技术分享,公众号《Java实用技术手册》和B站均有视频解说,欢迎来玩。

如果你觉得这篇文章有用,别忘了点赞+关注,一起进步!

spring注入静态变量有几种方法?不看的都掉坑里了!的更多相关文章

  1. Spring注入静态变量的方法,以及CXF如何获取客户端IP

    1.如果使用@Resource注解来注入静态变量的,服务器启动就会报错的.可以新增一个set方法,同时在set方法上用@Resource注解来注入. 2.或者直接在Spring的配置文件中使用< ...

  2. [转]spring 注入静态变量

    原文: http://www.cnblogs.com/xing901022/p/4168124.html 今天碰到一个问题,我的一个工具类提供了几种静态方法,静态方法需要另外一个类的实例提供处理,因此 ...

  3. 【Spring开发】—— Spring注入静态变量

    今天碰到一个问题,我的一个类提供了几种静态方法,静态方法需要另外一个类的实例提供处理,因此就写出了这样的代码: Class aa{ private static XXX xxx; xxx = Bean ...

  4. Spring注入静态变量(转)

    今天碰到一个问题,我的一个工具类提供了几种静态方法,静态方法需要另外一个类的实例提供处理,因此就写出了这样的代码: Class Util{ private static XXX xxx; xxx = ...

  5. spring 注入静态变量

    import java.util.Iterator; import java.util.LinkedList; import javax.annotation.PostConstruct; impor ...

  6. spring boot 静态变量注入配置文件

    spring 静态变量注入 spring 中不支持直接进行静态变量值的注入,我们看一下代码: @Component(value = "KafkaConfig") @Configur ...

  7. 解决Spring对静态变量无法注入问题(转)

    问题今天在学习的过程中想写一个连接和线程绑定的JDBCUtils工具类,但测试时发现一直报空指针异常,上网查了之后Spring并不支持对静态成员变量注入,所以光试用@Autowired肯定是不行的.可 ...

  8. SpringBoot使用@Value从yml文件取值为空--注入静态变量

    SpringBoot使用@Value从yml文件取值为空--注入静态变量     1.application.yml中配置内容如下:   pcacmgr:   publicCertFilePath: ...

  9. Ubuntu设置环境变量的几种方法

    1.Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1.1 永久的:需要修改配置文件,变量永久生效. 1.2 临时的:使用export命令声明即可,变量在关闭shell时失效 ...

  10. java环境变量配置四种方法

    原文:java环境变量配置四种方法 Java编程首要工作就是安装JDK(Java Development Kit).一通“NEXT”点完安装后就是最重要的环境变量设置了.也许有人会问为什么要设置环境变 ...

随机推荐

  1. Go语言核心36讲03

    [Go语言代码较多,建议配合文章收听音频.] 你好,我是郝林.从今天开始,我将和你一起梳理Go语言的整个知识体系. 在过去的几年里,我与广大爱好者一起见证了Go语言的崛起. 从Go 1.5版本的自举( ...

  2. centos7 redis6.2.6安装

    1. 源码包下载并解压 wget http://download.redis.io/releases/redis-6.2.6.tar.gz tar -zxvf redis-6.2.6.tar.gz 2 ...

  3. 网络编程:软件开发架构、架构总结、网络编程前戏、OSI七层协议简介、OSI七层协议之物理连接层、数据链路层、网络相关专业名词、OSI七层协议之网络层

    目录 软件开发架构 架构总结 网络编程前戏 OSI七层协议简介 OSI七层协议之物理连接层 OSI七层协议之数据链路层 网络相关专业名词 OSI七层协议之网络层 OSI七层协议之传输层 软件开发架构 ...

  4. i春秋xss平台

    点开是个普普通通的登录窗口,没有注册,只有登录,抓住包也没获取什么有用的信息,看了看dalao的wp才知道怎么做,首先抓包然后修改参数的定义来让其报错,pass原本的应该为整数,pass[]=就可以让 ...

  5. C温故补缺(一):数据类型和基本类型占位

    数据类型 基本类型:就是算术类型,包括整型和实型 枚举类型:一组离散的整数 void类型:无可用值类型 派生类型:指针(*),数组([]),结构体(struct),共用体(union),函数(fun( ...

  6. 学习ASP.NET Core Blazor编程系列十四——修改

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  7. 前端入门 HTTP协议 HTML简介 head内常见标签 body内常见标签 特殊符号 列表标签 表格标签 表单标签

    目录 前端和后端的概念 前端前戏之B/S架构 数据交互的协议 HTTP协议 1.四大特性 1. 基于请求响应 2. 基于TCP.IP作用与应用层之上的协议 3. 无状态 4. 无\短连接 2.数据格式 ...

  8. 微软出品自动化神器【Playwright+Java】系列(七) 之 元素的可操作性验证

    前言 昨天在某平台发表了一篇这系列的文章,结果不但提示说有违禁词(java也算?),然后文章审核通过后,文章还找不到,不到去哪了,表示很郁闷,去反应未果,确实有点尴尬了. 元素的可操作性验证 关于AP ...

  9. if多条件判断

    在一个if语句中,括号里面包含多个条件时.条件是否被执行要看if语句里面各个条件是"与"的关系还是"或"的关系. #include<stdio.h> ...

  10. Junti单元测试

    Junit单元测试 ## 测试分类 黑盒测试,白盒测试 黑盒测试,不需要写代码,给输入值,看程序是否能够输出期望的值 白盒测试,需要写代码的,关注程序的具体执行流程 Junit使用 是白盒测试 ### ...