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

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

相关文章
|
25天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
1月前
|
Java 测试技术 程序员
为什么Spring不推荐@Autowired用于字段注入?
作为Java程序员,Spring框架在日常开发中使用频繁,其依赖注入机制带来了极大的便利。然而,尽管@Autowired注解简化了依赖注入,Spring官方却不推荐在字段上使用它。本文将探讨字段注入的现状及其存在的问题,如难以进行单元测试、违反单一职责原则及易引发NPE等,并介绍为何Spring推荐构造器注入,包括增强代码可读性和维护性、方便单元测试以及避免NPE等问题。通过示例代码展示如何将字段注入重构为构造器注入,提高代码质量。
|
18天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
28 1
|
24天前
|
存储 安全 Java
|
19天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
25 1
|
16天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
20 0
|
1月前
|
缓存 Java Spring
源码解读:Spring如何解决构造器注入的循环依赖?
本文详细探讨了Spring框架中的循环依赖问题,包括构造器注入和字段注入两种情况,并重点分析了构造器注入循环依赖的解决方案。文章通过具体示例展示了循环依赖的错误信息及常见场景,提出了三种解决方法:重构代码、使用字段依赖注入以及使用`@Lazy`注解。其中,`@Lazy`注解通过延迟初始化和动态代理机制有效解决了循环依赖问题。作者建议优先使用`@Lazy`注解,并提供了详细的源码解析和调试截图,帮助读者深入理解其实现机制。
29 1
|
2月前
|
Java 应用服务中间件 Spring
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
|
3月前
|
XML Java 数据格式
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
这篇文章是Spring5框架的实战教程,主题是IOC容器中Bean的集合属性注入,通过XML配置方式。文章详细讲解了如何在Spring中注入数组、List、Map和Set类型的集合属性,并提供了相应的XML配置示例和Java类定义。此外,还介绍了如何在集合中注入对象类型值,以及如何使用Spring的util命名空间来实现集合的复用。最后,通过测试代码和结果展示了注入效果。
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
|
3月前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
43 0