在spring工程中,我们经常需要使用到配置文件的一些信息,在每个类中定义,可能导致这些信息变得零散。spring给我们提供了一个注解@Value(),使我们可以注入配置文件中的数据。

bootstrap.yml

jay:

key: www.baidu.com

如果你想在你的工具类中注入这个变量,那么你可能面临问题,方法是static的,那么你需要使用静态变量作为参数在方法中使用。

错误示范:

public class testUtils{

@Value("${jay.key}")

private static String url;

}

正确示范

@Configuration

public class testUtils{

private static String url;

@Value("${jay.key}")

public void setUrl(String url) {

url= url;

}

}

通过@Component和在Setter上打上注解,即可将配置文件的信息注入到静态变量中了.

为什么会出现空指针?

先说结论: Spring从源码层面不提供对static修饰符的成员变量进行注入.

AutowiredAnnotationBeanPostProcessor#buildAutowiringMetadata

/**

* 解析当前Class被@Autowired标记的成员

* @param clazz

* @return

*/

private InjectionMetadata buildAutowiringMetadata(final Class> clazz) {

List elements = new ArrayList<>();

Class> targetClass = clazz;

// 递归遍历当前类及其所有基类,解析全部注解元信息

do {

final List currElements = new ArrayList<>();

// 收集被@Autowired、@Value标记的Field.

// 利用反射机制获取给定类中所有的声明字段,获取字段上的注解信息

// doWithLocalFields->获取当前类的所有Field,每个field执行lambda内的逻辑.

ReflectionUtils.doWithLocalFields(targetClass, field -> {

// 此处逻辑较为复杂,通过debug发现如果为被标注的属性,会返回required:true.

// 大致的意思是这个field是否被特定的注解标记?这里留一个疑问

AnnotationAttributes ann = findAutowiredAnnotation(field);

if (ann != null) {

// 如果是static属性的成员,Spring不提供支持

if (Modifier.isStatic(field.getModifiers())) {

if (logger.isInfoEnabled()) {

logger.info("Autowired annotation is not supported on static fields: " + field);

}

return;

}

// 判断required的状态

boolean required = determineRequiredStatus(ann);

// 将当前成员添加进currElements

currElements.add(new AutowiredFieldElement(field, required));

}

});

// 省略....

}

static的变量是归属于Class的,而Spring容器上下文只对Java对象进行管理,Spring不鼓励对static变量做注入Bean的操作,因此如果需要在某些工具类中将Bean赋值给静态变量,可以使用构造注入的方式. 或者使用@PostConstruct作为桥梁.

想深入的朋友可以看看这篇文章: 想用@Autowired注入static静态成员?官方不推荐你却还偏要这么做

Java静态变量注入配置值,工具类使用@Value将信息注入到静态变量中相关推荐

  1. (10)Java泛型-Map集合-集合框架工具类-可变参数-静态导入

    -- 部分1.5新特性Java泛型-Map集合-集合框架工具类 泛型 概述: JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制. 对于泛型可以这样理解: 没有使用泛型时,只要是对 ...

  2. java excel 取值_java实现Excel 单元格取值工具类

    在工作中经常遇到通过excel获取数据的需求,比如通过excel将数据提交到数据库等.现针对excel单元格的取值方法提取出来作为一个工具类. 具体代码如下: import org.apache.po ...

  3. php cdi_使用CDI的InjectionPoint注入配置值

    php cdi 依赖注入是用于组织类依赖的一项出色技术. 当前类中需要的所有类实例都是在运行时从DI容器提供的. 但是您的配置呢? 当然,您可以创建一个" Configuration&quo ...

  4. 使用CDI的InjectionPoint注入配置值

    依赖注入是用于组织类依赖的一项出色技术. 当前类中需要的所有类实例都是在运行时从DI容器提供的. 但是您的配置呢? 当然,您可以创建一个" Configuration"类,并在需要 ...

  5. Java实现Google的S2算法工具类

    WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 Google S2 经纬度 转 CellId 经纬度 转 cellToken ...

  6. java获取客户端的IP地址工具类

    java获取客户端的IP地址工具类 import java.net.InetAddress; import java.net.UnknownHostException;import javax.ser ...

  7. Java学习总结:58(Collections工具类)

    Collections工具类 Java提供了一个集合的工具类--Collections,这个工具类可以实现List.Set.Map集合的操作.Collections类的常用方法如下: No. 方法 类 ...

  8. java配置文件工具类,java项目加载配置文件的工具类

    java项目加载配置文件的工具类 package com.loadproperties; import java.io.IOException; import java.io.InputStream; ...

  9. Java 图片添加数字暗水印工具类

    Java 图片添加数字暗水印工具类. package cnki.thesis.common.utils;import org.opencv.core.*;import java.util.ArrayL ...

最新文章

  1. variable ‘‘ of type ‘‘ referenced from scope ‘‘, but it is not defined 异常解决方法
  2. snapshot相关
  3. php最常用方法,php 常用方法
  4. 计算机网络应用云计算,计算机网络云计算的类型
  5. StarUML建模软件
  6. sklearn中的逻辑回归
  7. 运用Loadrunner测试Mysql数据库性能
  8. If-Modified-Since If-None-Match
  9. 2021-08-31Flink 中的核心概念和基础考察
  10. 键盘按键的各种编码对照表
  11. ssh介绍和使用--SecureCRT工具和ssh命令使用,以及sshd配置
  12. 图像识别中的边框回归笔记,终于搞明白了啊!
  13. 初探MYD-AM335x开发板
  14. 西安交通大学计算机专业,西安交通大学计算机科学与技术专业录取分数线?
  15. 用Python把PDF文件转换成Word文档
  16. 微信开发遇到的那些坑
  17. CondaSSLError: OpenSSL appears to be unavailable on this machine
  18. SpringBoot海景房出租管理系统+代码讲解
  19. 背光的工作原理及结构
  20. linux 搜狗拼音输入法

热门文章

  1. swift学习笔记之-协议
  2. VC6.0 导入资源崩溃
  3. 删除vs的调试其他软件的功能
  4. WCF从理论到实践(5):Binding细解(转)
  5. JavaEE实战班第16天
  6. 从0到1详解数据挖掘过程
  7. 哪有那么多「能力问题」,在你牛到一定程度前,全是「态度问题」
  8. STM32之ADC原理
  9. 代码review,瑞出事来了!
  10. Dubbo为什么用Go重写?