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站均有视频解说,欢迎来玩。

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

最新文章

  1. js文件中函数前加分号和感叹号是什么意思?
  2. ios使用CocoaHTTPServer实现文件共享
  3. 【Alpha版本】冲刺总结随笔
  4. 如何站在使用者的角度来设计SDK-微信公众号开发SDK(消息处理)设计之抛砖引玉
  5. 好推二维码如何通过应用宝微下载支持微信自动打开APP下载?
  6. Linux_shell脚本_遍历文件夹下所有文件
  7. POJ 3484
  8. 嵌入式 Linux进程含义知多少
  9. GDB调试总结__1
  10. Linux - Shell变量的配置守则
  11. HDU-1017
  12. Python 八皇后问题
  13. 解决postman环境切换,自动获取api签名时间及签名
  14. 2019 年 SpreadJS产品路线图(Roadmap)
  15. Nerd的套现ATM机
  16. java文件夹相关操作 演示样例代码
  17. 通过状态机来对axi_lite总线进行操作
  18. 【原创】kerberos无密码登录
  19. GG配置ggmgr进程
  20. 【JSP】jsp报错:Syntax error, insert "}" to complete MethodBody

热门文章

  1. 野火 STM32MP157 开发板内核和设备树的编译烧写
  2. C# 窗体相关知识
  3. cookie中 防止重复存值 (可用于历史记录等)
  4. Go语言核心36讲27
  5. C# Panel动态添加滚动条
  6. 【Java进阶】五分钟快速掌握JVM优化概念、常用命令、工具、JUC、多线程、GC等知识
  7. MyBatis02:流程分析、注解、代理dao实现CRUD、参数深入、传统DAO、配置
  8. 【消息队列面试】6-10:Rebalance机制、副本同步机制、架构设计、zk的作用、kafka的高性能
  9. 【离线数仓】Day02-用户行为数据仓库:分层介绍、环境搭建(hive、tez)、LZO压缩、建表查询导入加索引、编写脚本
  10. 《HTTP权威指南》– 6.代理