Java静态变量注入配置值,工具类使用@Value将信息注入到静态变量中
在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将信息注入到静态变量中相关推荐
- (10)Java泛型-Map集合-集合框架工具类-可变参数-静态导入
-- 部分1.5新特性Java泛型-Map集合-集合框架工具类 泛型 概述: JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制. 对于泛型可以这样理解: 没有使用泛型时,只要是对 ...
- java excel 取值_java实现Excel 单元格取值工具类
在工作中经常遇到通过excel获取数据的需求,比如通过excel将数据提交到数据库等.现针对excel单元格的取值方法提取出来作为一个工具类. 具体代码如下: import org.apache.po ...
- php cdi_使用CDI的InjectionPoint注入配置值
php cdi 依赖注入是用于组织类依赖的一项出色技术. 当前类中需要的所有类实例都是在运行时从DI容器提供的. 但是您的配置呢? 当然,您可以创建一个" Configuration&quo ...
- 使用CDI的InjectionPoint注入配置值
依赖注入是用于组织类依赖的一项出色技术. 当前类中需要的所有类实例都是在运行时从DI容器提供的. 但是您的配置呢? 当然,您可以创建一个" Configuration"类,并在需要 ...
- Java实现Google的S2算法工具类
WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 Google S2 经纬度 转 CellId 经纬度 转 cellToken ...
- java获取客户端的IP地址工具类
java获取客户端的IP地址工具类 import java.net.InetAddress; import java.net.UnknownHostException;import javax.ser ...
- Java学习总结:58(Collections工具类)
Collections工具类 Java提供了一个集合的工具类--Collections,这个工具类可以实现List.Set.Map集合的操作.Collections类的常用方法如下: No. 方法 类 ...
- java配置文件工具类,java项目加载配置文件的工具类
java项目加载配置文件的工具类 package com.loadproperties; import java.io.IOException; import java.io.InputStream; ...
- Java 图片添加数字暗水印工具类
Java 图片添加数字暗水印工具类. package cnki.thesis.common.utils;import org.opencv.core.*;import java.util.ArrayL ...
最新文章
- variable ‘‘ of type ‘‘ referenced from scope ‘‘, but it is not defined 异常解决方法
- snapshot相关
- php最常用方法,php 常用方法
- 计算机网络应用云计算,计算机网络云计算的类型
- StarUML建模软件
- sklearn中的逻辑回归
- 运用Loadrunner测试Mysql数据库性能
- If-Modified-Since If-None-Match
- 2021-08-31Flink 中的核心概念和基础考察
- 键盘按键的各种编码对照表
- ssh介绍和使用--SecureCRT工具和ssh命令使用,以及sshd配置
- 图像识别中的边框回归笔记,终于搞明白了啊!
- 初探MYD-AM335x开发板
- 西安交通大学计算机专业,西安交通大学计算机科学与技术专业录取分数线?
- 用Python把PDF文件转换成Word文档
- 微信开发遇到的那些坑
- CondaSSLError: OpenSSL appears to be unavailable on this machine
- SpringBoot海景房出租管理系统+代码讲解
- 背光的工作原理及结构
- linux 搜狗拼音输入法