SpringBoot详解如果通过@Value注解给静态变量注入值

目录
  • 前序
  • 方案一
  • 方案二
  • 方案三
  • 使用场景
  • 总结

最近做项目的时候,给static变量赋值, 使用 @value注解 ,结果 获取一直为null ,

1、spring不允许/不支持把值注入到静态变量中
 
2、Spring的@Value依赖注入是依赖set方法
 
3、set方法是普通的对象方法
 
4、static变量是类的属性,static没有set方法

前序

SpringBoot中使用@Value()只能给普通变量注入值,不能直接给静态变量赋值

例如,application-dev.properties配置文件有如下配置:

给普通变量赋值时,直接在变量声明之上添加@Value()注解即可,如下所示:

当要给静态变量注入值的时候,若是在静态变量声明之上直接添加@Value()注解是无效的,例如:

虽然没有编译和运行上的报错,经调试可知这种注解方式mailUsername、mailPassword、mailHost的值都是null,也就是说直接给静态变量读取配置文件是无效的,如下所示:

方案一

若要给静态变量赋值,可以使用set()方法,其中需要在类上加入@Component注解,方法名(例如setMailUsername)和参数名(例如username)可以任意命名,如下所示:

调试结果如下:

@Component
public class JDConfig {
    /** 转换系统地址 */
    public static String url;
    /** 转换系统应用系统id */
    public static String sysId;
    /** 是否开启鉴权 */
    public static Boolean isAuth;
    /** 转换系统应用系统秘钥(如开启鉴权需要填写) */
    public static String sysKey;
    @Autowired(required = false)
    @Value(value="${jd.serverHost:}")
    public void setUrl( String url) {
        JDConfig.url = url;
    }
    @Autowired(required = false)
    @Value(value="${contract.jd.appKey:}")
    public void setSysId( String sysId) {
        JDConfig.sysId = sysId;
    }
    @Autowired(required = false)
    @Value(value="${jd.isAuth:true}")
    public void setAuth(Boolean isAuth) {
        JDConfig.isAuth = isAuth;
    }
    @Autowired(required = false)
    @Value(value="${contract.jd.appSecurity:}")
    public void setSysKey(String sysKey) {
        JDConfig.sysKey = sysKey;
    }
    public  String getUrl() {
        return url;
    }
    public  String getSysId() {
        return sysId;
    }
    public  Boolean getIsAuth() {
        return isAuth;
    }
    public  String getSysKey() {
        return sysKey;
    }
}

方案二

如果你觉得@value注解麻烦。可以使用@ConfigurationProperties注解代替,这样比较简洁

  • 前缀要写合适
  • 方法名(例如setOssUrl)必须和属性保持一致,例如写为setUrl()会注入失败
  • 类上加入@Component注解

最近的项目还有有这样一个需求,就是类中有几个静态变量,初始化的时候,他们的值需要读取一个配置文件,获取一个code,然后用这个code拼接而成。 这个code不是静态的变量,怎么实现的呢,代码如下:

    @Value("${projectCode}")
    private String projectCode;
    public static String COOPERATIVE_GOV_TEMPLATE_KEY ;
    // 消息短信配置
    public static String DEPOLY_KEY;
    // 消息短信详情配置
    public static String MSG_DEPOLY_KEY;
    // 过滤配置
    public static String MSG_FILTER_KEY;
    @PostConstruct
    public void init() {
        COOPERATIVE_GOV_TEMPLATE_KEY = projectCode + ":template";
        DEPOLY_KEY = projectCode + ":depoly";
        MSG_DEPOLY_KEY = projectCode + ":msgDepoly";
        MSG_FILTER_KEY = projectCode + ":msgFilter";
    }

这样当项目启动的时候,这几个静态变量就有有值了。 一定要注意这个类要被spring管理,也就是要用@Controller,@Service,@Component等注解注释。

方案三

  • 类上加入@Component注解
  • @PostConstruct注解修饰的方法中进行赋值操作

使用场景

那么问题来啦!我们什么场景下需要把值注入到静态变量?

场景一

场景二

工具类中将值注入静态变量,就可以直接在静态方法之中使用,我本文中遇到的正是这个场景

总结

本文中,我们从一个实际问题出发,探寻了三种在springboot中静态变量注入方案,希望对大家有所帮助。

到此这篇关于SpringBoot详解如果通过@Value注解给静态变量注入值的文章就介绍到这了,更多相关SpringBoot @Value内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot的属性赋值@Value的用法说明

    目录 今天学习到了SpringBoot 的属性赋值@Value用法 先总结 例子 @Value的使用及注意事项 为什么使用 参数形式 前置条件(注意事项) 今天学习到了SpringBoot 的属性赋值@Value用法 先总结 @Value(" 张三 "):直接附在属性名上,在Bean初始化时,会赋初始值 @Value(" #{ 20 - 2 } "):可以用 #{ },里面可以写表达式,当然也可以直接 @Value(" #{ 18 } ") 或

  • springboot如何使用@Value获取配置文件的值

    使用@Value获取配置文件的值 1.创建配置文件(application.properties) spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.user=admin spring.activemq.password=admin spring.activemq.in-memory=true spring.activemq.pool.enabled=false 2.创建测试类(MyController.java)

  • springboot中@Value的工作原理说明

    我们知道springboot中的Bean组件的成员变量(属性)如果加上了@Value注解,可以从有效的配置属性资源中找到配置项进行绑定,那么这一切是怎么发生的呢? 下文将简要分析一下@Value的工作原理. springboot版本: springboot-2.0.6.RELEASE 概述 springboot启动过程中,有两个比较重要的过程,如下: 1 扫描,解析容器中的bean注册到beanFactory上去,就像是信息登记一样. 2 实例化.初始化这些扫描到的bean. @Value的解析

  • springboot使用@value注入配置失败的解决

    目录 springboot使用@value注入配置文件失败 问题解决方向一 问题解决方向二 @Value注入失败,注入值为null的问题 大概就是下面这样 结果不知道为什么,@Value注入一直为空?? 原因如下 解决办法 springboot使用@value注入配置文件失败 遇到的问题原因是:类中注入对象不能用static. 问题解决方向一 1.改为如图示,去掉static 问题解决方向二 1.仍然定义静态变量,但在其set方法上使用@Value进行赋值 2.仍然定义静态变量,同时定义一个普通

  • 解决SpringBoot @value注解取不到值的问题

    关于@value的springapplication容器的问题 1.在src/main/resources下创建stu.properties文件 ## student.name=Tom student.age=22 student.birthday=1996/01/10 student.sex=true student.hobbies[0]=swimming student.hobbies[1]=basketball student.skills[0]=programming student.s

  • SpringBoot 使用 @Value 注解读取配置文件给静态变量赋值

    1.application.properties 配置文件 mail.username=xue@163.com mail.password=xue mail.host=smtp.163.com mail.smtp.auth=true 2.给普通变量赋值,直接在变量上添加 @Value 注解 import org.springframework.beans.factory.annotation.Value; public class MailConfig { @Value("${mail.user

  • SpringBoot使用@Value实现给静态变量注入值

    SpringBoot中使用@Value()只能给普通变量注入值,不能直接给静态变量赋值 例如 application-dev.properties 配置文件有如下配置: 给普通变量赋值时,直接在变量声明之上添加@Value()注解即可,如下所示: 当要给静态变量注入值的时候,若是在静态变量声明之上直接添加@Value()注解是无效的,例如: 虽然没有编译和运行上的报错,经调试可知这种注解方式mailUsername.mailPassword.mailHost的值都是null,也就是说直接给静态变

  • Springboot中@Value的使用详解

    Springboot通过@Value注解将配置文件中的属性注入到容器内组件中(可用在@Controller.@Service.@Configuration.@Component等Spring托管的类中) 1.普通字符串注入 例:yml中存在key: name: zs @Value注入 @Value("${name}") public String name; 当yml中的name没有对应值时,即yml中为: name: 此时字符串name的值为"" 可设置注入属性的

  • SpringBoot中的@Value注解用法

    目录 一.前言 二.数组怎么样 三.替代方法 3.1 解析 List 3.2 解析 Set 3.3 解析 Map 四.后续 一.前言 在日常开发中,经常会遇到需要在配置文件中,存储 List 或是 Map 这种类型的数据. Spring 原生是支持这种数据类型的,以配置 List 类型为例,对于 .yml 文件配置如下: test: list: - aaa - bbb - ccc 对于 .properties 文件配置如下所示: test.list[0]=aaa test.list[1]=bbb

  • SpringBoot详解如果通过@Value注解给静态变量注入值

    目录 前序 方案一 方案二 方案三 使用场景 总结 最近做项目的时候,给static变量赋值, 使用 @value注解 ,结果 获取一直为null , 1.spring不允许/不支持把值注入到静态变量中 2.Spring的@Value依赖注入是依赖set方法 3.set方法是普通的对象方法 4.static变量是类的属性,static没有set方法 前序 SpringBoot中使用@Value()只能给普通变量注入值,不能直接给静态变量赋值 例如,application-dev.properti

  • SpringBoot通过@Value实现给静态变量注入值详解

    目录 一.简介 二.@Value给静态变量注入值 方案一 方案二 三.总结 一.简介 SpringBoot 中给普通变量注入值只需在变量上添加 @Value 注解即可. application.properties 配置文件有如下配置: mail.name=admin@163.commain.pwd=admin123 给普通变量赋值时,直接在变量声明之上添加 @Value() 注解即可. @Value("${mail.name:admin@163.com}") private Stri

  • 基于@PostConstruct注解的使用,解决向静态变量注入值

    目录 @PostConstruct注解的使用,向静态变量注入值 说说思路 @PostConstruct和静态变量注入和spring初始化 执行顺序 关于spring初始化操作 @PostConstruct注解的使用,向静态变量注入值 今天在编写工具类时遇到了一个问题,一般在定义工具类方时,我们会将工具类中的方法定义成static类型,使用时可以通过类名.方法名获取该方法,无需实例化出对象才能使用其内部方法,但是当有些参数在配置文件中定义时,我们需要拿到这些参数就需要在工具类方法使用@Value注

  • Springboot详解RocketMQ实现消息发送与接收流程

    springboot+rockermq 实现简单的消息发送与接收 普通消息的发送方式有3种:单向发送.同步发送和异步发送. 下面来介绍下 springboot+rockermq 整合实现 普通消息的发送与接收 创建Springboot项目,添加rockermq 依赖 <!--rocketMq依赖--> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-

  • SpringBoot详解整合MyBatis过程中可能遇到的问题

    尽量不要用 jUnit 提供的单元测试 提一个要求尽量使用SpringBoot 提供的测试类进行测试,能够自动扫描组件以及使用容器中的bean对象 还有如果有组件 中存在注入对象的话,那么必须在SpringBoot容器中取出 这个组件,进而使用注入的对象的功能!!! 今天有个错误,花了很长时间来解决,最后发现是一个很低级很基础的错误! 这是mapper接口,使用@mapper 相当于将接口的代理对象注册进入bean中,但是上下文中找不到(其实是正常) 因为 @Mapper 这个注解是 Mybat

  • springboot详解整合swagger方案

    目录 1.Swagger简介 2.整合步骤 1.Swagger简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 官网: ( https://swagger.io/ ) 主要作用是: 1. 使得前后端分离开发更加方便,有利于团队协作 2. 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担 3. 功能测试 Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫 Springfox.通过

  • springBoot详解集成Swagger流程

    目录 Swagger简介 SpringBoot集成Swagger 配置Swagger Swagger配置扫描接口 配置是否启动Swagger 配置API文档的分组 实体类配置 常用的注解 小结 目标: 了解Swagger的作用和概念 了解前后端分离 在springBoot中集成Swagger Swagger简介 前后端分离 VUE+springBoot 后端 :后端控制层.服务层.数据访问层 前端 :前端控制层.视图层 前后端通过API进行交互 前后端相对独立,松耦合 可以部署在不同的服务器上

  • SpringBoot详解整合Spring Boot Admin实现监控功能

    目录 监控 监控的意义 可视化监控平台 监控原理 自定义监控指标 监控 ​ 在说监控之前,需要回顾一下软件业的发展史.最早的软件完成一些非常简单的功能,代码不多,错误也少.随着软件功能的逐步完善,软件的功能变得越来越复杂,功能不能得到有效的保障,这个阶段出现了针对软件功能的检测,也就是软件测试.伴随着计算机操作系统的逐步升级,软件的运行状态也变得开始让人捉摸不透,出现了不稳定的状况.伴随着计算机网络的发展,程序也从单机状态切换成基于计算机网络的程序,应用于网络的程序开始出现,由于网络的不稳定性,

  • SpringBoot详解整合Redis缓存方法

    目录 1.Spring Boot支持的缓存组件 2.基于注解的Redis缓存实现 3.基于API的Redis缓存实现 1.Spring Boot支持的缓存组件 在Spring Boot中,数据的缓存管理存储依赖于Spring框架中cache相关的org.springframework.cache.Cache和org.springframework.cache.CacheManager缓存管理器接口. 如果程序中没有定义类型为CacheManager的Bean组件或者是名为cacheResolve

随机推荐