spring注入静态变量有几种方法?不看的都掉坑里了!

简介: spring注入静态变量有几种方法?不看的都掉坑里了!

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


代码示例

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

/*** the StaticInjectionUtils** @author Java实用技术手册* @date 2023-01-17*/@ComponentpublicclassStaticInjectionUtils {
@Value("${normal.value}")
privateStringnormalValue;
@Value("${static.value}")
privatestaticStringstaticValue;
@PostConstructpublicvoidinit() {
System.err.println("*** normalValue="+normalValue);
System.err.println("*** staticValue="+staticValue);
    }
}
// 运行结果//*** normalValue=normal  --有结果//*** staticValue=null    --无结果


?set注入(推荐)

@ComponentpublicclassStaticInjectionUtils {
publicstaticStringstaticValue;
@Value("${static.value}")
publicvoidsetStaticValue(StringstaticValue) {
StaticInjectionUtils.staticValue=staticValue;
    }
@PostConstructpublicvoidinit() {
System.err.println("*** staticValue="+staticValue);
    }
}
// *** staticValue=static

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

  • 注意点2:
    静态变量不要用this引用,要用类名.变量,虽然你用this也能工作。

@Value("${static.value}")
publicvoidsetStaticValue(StringstaticValue) {
this.staticValue=staticValue;
}

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

  • 注意点3:
    方法名无所谓,你可以随便改,不信你试试。

?PostConstruct注入

@ComponentpublicclassStaticInjectionUtils {
@Value("${static.value}")
privateStringstaticValue;
publicstaticStringSTATIC_VALUE2;
@PostConstructpublicvoidinit() {
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变体

@ComponentpublicclassStaticInjectionUtils {
privatestaticStringstaticValue;
@AutowiredpublicvoidsetStaticValue(@Value("${static.value}") StringstaticValue) {
System.out.println("set staticValue="+staticValue);
StaticInjectionUtils.staticValue=staticValue;
    }
@PostConstructpublicvoidinit() {
System.err.println("*** staticValue="+staticValue);
    }
}

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


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

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


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

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

相关文章
|
3天前
|
人工智能 JSON 前端开发
Spring Boot解决跨域问题方法汇总
Spring Boot解决跨域问题方法汇总
|
3天前
|
Java Spring 容器
解决Spring的UnsatisfiedDependencyException异常的方法
在Spring开发中,UnsatisfiedDependencyException异常意味着依赖注入失败,影响应用稳定性。该异常由Spring容器在无法满足bean依赖时抛出,常见原因包括bean定义错误、循环依赖、多个候选bean等。解决方法包括:检查bean定义和注入的正确性、解决循环依赖、确认依赖包的兼容性、使用@Qualifier或@Primary注解。通过日志、调试工具和异常对比来定位问题。持续学习Spring框架有助于更好地解决此类异常。
45 1
|
3天前
|
XML Java 开发者
Spring Boot中的bean注入方式和原理
Spring Boot中的bean注入方式和原理
134 0
|
3天前
|
缓存 Java API
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
|
3天前
|
存储 NoSQL Java
Spring Boot统计一个Bean中方法的调用次数
Spring Boot统计一个Bean中方法的调用次数
44 1
|
3天前
|
Java Spring
使用JDBCTemplate实现与Spring结合,方法公用 ——测试(EmpDaoImplTest)
使用JDBCTemplate实现与Spring结合,方法公用 ——测试(EmpDaoImplTest)
13 0
|
1天前
|
前端开发 Java 编译器
详解Spring与JDK注入
依赖注入是Spring框架的核心概念之一,它通过将对象之间的依赖关系外部化,实现了松耦合和可测试性。面向切面编程则允许开发人员将横切关注点(如日志、事务管理)从应用程序的主要业务逻辑中分离出来,以提高代码的模块化和可维护性。
10 4
|
3天前
|
Java Spring
Spring的@Retryable实现方法重试
`@Retryable`注解用于配置异常重试,参数包括:指定异常类型`value`,额外包含异常`include`,排除异常`exclude`,最大尝试次数`maxAttempts`和回退策略`backoff`。可选地,可以用`retryExceptions`列表替换`value`。当重试失败,可使用`@Recover`注解定义恢复逻辑。
19 1
|
3天前
|
XML Java 数据格式
Spring 属性注入方式
Spring 属性注入方式
14 2
|
3天前
|
Java 微服务 Spring
Spring Boot中获取配置参数的几种方法
Spring Boot中获取配置参数的几种方法
22 2
http://www.vxiaotou.com