详解Spring如何注入静态变量

 更新时间:2023年06月26日 10:27:36   作者:东方甲乙木土  
这篇文章主要为大家详细介绍了Spring是如何注入静态变量的,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下

为什么 Spring 不可以注入静态变量

@Autowired 不能注入 static 成员属性

静态变量和静态方法属于类,而 Spring 容器中管理的是对象,使用 @Autowired 注入的是容器中的对象实例,静态变量和方法是不能直接使用 @Autowried 注入的。

Spring 不建议开发代码中为静态变量注入属性值,类加载时会优先加载静态变量,此时 Spring 的上下文环境还没有完成加载,因此不可以为静态变量绑定值。

另一方面,在 @Autowired 注解注入扫描 Class 类原数据时,会直接忽略类的使用 static 关键字标识的成员。

使用 @Value 读取配置文件时,配置文件内容会作为 Properties 对象的属性管理在容器中,使用注解加载到变量上时就是使用容器注入的机制将配置内容赋值给相应属性。

@Value 注解标注静态变量

如果 @Value 注解标注在 static 或 final 变量,并不能将属性值注入,最终得到的变量值是 null。

Spring 注入内容到静态变量中

@Value + set 方法注入静态变量

如果想要为 static 变量注入值,可以间接的操作方式,比如可以通过注解标注在 set 方法(非静态)上,使用 set 方法注入的方式将属性值赋值到静态变量中。

 @Component
 public class Customer {
     private static String name;
     @Value("${customer.name}")
     public void setName(String name) {
         Customer.name = name;
     }
 }

定义静态方法工具类时,则不建议在工具类中使用注入的内容,因为工具类定义的是静态方法,使用时容器并没有加载完成,容易出现 NPE 问题。

Properties 注入静态变量

Properties 作为 java.util 包中用来读取配置文件的类,其本身是一个 Hashtable,可以将 *.properties 配置文件内容以键值对的形式存储在对象中。

Properties 使用时可以通过 load() 方法自定义指定需要读取的配置文件,通过流的方式读取文件中内容,并通过 getProperty() 方法读取指定配置信息。

因为 Properties 是通过读取文件内容来获取配置文件,不依赖 Spring 容器的加载,只要指定读取配置文件后,就可以获取到对应的属性,可以在加载类时赋值到静态变量。

具体使用方法为

Properties 读取文件工具类

public class PropertiesUtil {
    private static Properties readProperties(String configFile) {
        Properties properties = new Properties();
        try {
           properties.load( new ClassPathResource(path).getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return properties;
    }
}

使用 Properties 注入静态变量

@Component
 public class Customer {
     private static Properties properties = PropertiesUtil.readProperties("application.properties");
     private static String name = properties.getProperty("name");
 }

Properties 作为 Java 工具包中读取配置文件的类,可以读取配置并赋值给静态变量,但是 Properties 仅可以读取 .properties 配置文件,而不可以解析 .yml 配置文件。

详细的 Properties 使用方法可见:SpringBoot 使用 Properties 读取配置文件

Environment 注入静态变量

Spring 中有一个类 Environment,它可以被认为是当前应用程序正在运行的环境,继承了 PropertyResolver 接口,因此可以作为一个属性解析器使用。

Environment 可以从容器中注入,并使用对象的 getProperty() 方法来获取属性值。

只要在类加载静态属性时获取到初始化的 Environment 对象信息,就可以为静态变量赋值。

可以通过 @Autowired + set 方法将 Environment 对象注入到静态变量中,然后使用静态变量获取配置项即可。

@Component
public class Customer {
    private static Environment env;
    @Autowired
    public void setEnvironment(Environment environment) {
        env = environment;
    }
    private static String name =  env.getProperty("name");
}

Environment 可以读取 .properties 配置文件和 .yml 配置文件,是更好的一种选择。

综述

综上所述,有如下结论:

  • 在 Spring 项目中不建议将内容注入到静态变量中,因此稍有疏忽则会出现 NPE 问题
  • 如果使用 @Component、@Value、@Autowired 等注解委婉的实现了注入到静态变量中,但其终究还是在 Spring 容器加载之后进行加载赋值的,实际使用仍依赖 Spring 容器环境
  • 如果是单纯的 Java 静态工具类,则应该使用 Properties 类加载文件的方式,这样才可以完全不依赖 Spring 环境的运行。

到此这篇关于详解Spring如何注入静态变量的文章就介绍到这了,更多相关Spring注入静态变量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java利用遗传算法求解最短路径问题

    Java利用遗传算法求解最短路径问题

    遗传算法(Genetic Algorithm,GA)最早是由美国的John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。本文将利用遗传算法求解最短路径问题,需要的可以参考一下
    2022-06-06
  • Java集合之Set、HashSet、LinkedHashSet和TreeSet深度解析

    Java集合之Set、HashSet、LinkedHashSet和TreeSet深度解析

    这篇文章主要介绍了Java集合之Set、HashSet、LinkedHashSet和TreeSet深度解析,List是有序集合的根接口,Set是无序集合的根接口,无序也就意味着元素不重复,更严格地说,Set集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素,需要的朋友可以参考下
    2023-09-09
  • spring data jpa分页查询示例代码

    spring data jpa分页查询示例代码

    本篇文章主要介绍了spring data jpa分页查询示例代码,分页在很多项目中都能使用,具有一定的参考价值,有兴趣的可以了解一下。
    2017-03-03
  • Spring Boot集成Druid数据库连接池

    Spring Boot集成Druid数据库连接池

    这篇文章主要介绍了Spring Boot集成Druid数据库连接池,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • SpringBoot之配置logging日志及在控制台中输出过程

    SpringBoot之配置logging日志及在控制台中输出过程

    这篇文章主要介绍了SpringBoot之配置logging日志及在控制台中输出过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • mybatis-plus 新增/修改如何实现自动填充指定字段

    mybatis-plus 新增/修改如何实现自动填充指定字段

    这篇文章主要介绍了mybatis-plus 新增/修改实现自动填充指定字段方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java实现登录和注册案例

    Java实现登录和注册案例

    这篇文章主要为大家详细介绍了Java实现登录和注册案例,把用户信息存进集合,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Java中常见的4种限流算法详解

    Java中常见的4种限流算法详解

    这篇文章主要介绍了Java中常见的4种限流算法详解,FixedWindowRateLimiter 类表示一个固定窗口限流器,使用 limit 和 interval 参数分别表示限制请求数量和时间间隔,缺点是短时间内可能会流量翻倍,需要的朋友可以参考下
    2023-12-12
  • 解决idea 拉取代码出现的 “ Сannot Run Git Cannot identify version of git executable: no response“的问题

    解决idea 拉取代码出现的 “ Сannot Run Git Cannot identify version of

    这篇文章主要介绍了解决idea 拉取代码出现的 “ Сannot Run Git Cannot identify version of git executable: no response“的问题,需要的朋友可以参考下
    2020-08-08
  • SpringCloud连接不上远程Nacos问题排查

    SpringCloud连接不上远程Nacos问题排查

    本文主要介绍了SpringCloud连接不上远程Nacos问题排查,可能是因为未开放端口,或集群内部通信异常等,下面就来介绍一下问题解决,感兴趣的可以了解一下
    2024-06-06

最新评论