无法获取未定义或 null 引用的属性“value”_SpringBoot之Spring@Value属性注入使用详解

bb53d89c8bddcdff24bdd86caa7023f5.png

在使用Spring框架的项目中,@Value是使用比较频繁的注解之一,它的作用是将配置文件中key对应的值赋值给它标注的属性。在日常使用中我们常用的功能都比较简单,本篇文章系统的带大家来了解一下@Value的使用方法。

@Value注入支持形式

@Value属性注入功能根据注入的内容来源可分为两类:通过配置文件的属性注入和通过非配置文件的属性注入。

通过配置文件的注入根据配置文件的来源又可分为两类:一类为默认的Spring Boot会自动加载的配置文件application.properties中的属性;另一类为自定义配置文件中的属性,需要先通过@PropertySource加载。

而非配置文件注入的类型又分为:

  • 注入普通字符串
  • 注入操作系统属性
  • 注入表达式结果
  • 注入其他Bean属性
  • 注入文件资源
  • 注入URL资源

基于配置文件注入

首先来看数据来源自配置文件的注入,无论是会被默认加载的application.properties或自定义的my.properties文件。比如,application.properties中定义属性值的形式如下:

user.name=admin

在my.properties配置文件中定义的属性如下:

user.password=pwd123

那么,@Value在Bean中的使用形式为:

@PropertySource("classpath:my.properties")@RestControllerpublic class ValueController {    /**     * 获取位于application.properties中配置的属性     */    @Value("${user.name}")    private String name;    /**     * 获取位于my.properties中的配置属性     */    @Value("${user.password}")    private String password;}

不同的是,在Spring Boot项目中,如果是自定义的my.properties文件,需要在某个类中通过@PropertySource引入该配置文件,而application.properties中的属性会自动被加载。

同时,不仅仅可以通过@Value注入单个属性,还可以注入数组和列表形式。比如如下配置:

tools=car,train,airplane

可以通过以下方式注入:

/** * 注入数组(自动根据","分割) */@Value("${tools}")private String[] toolArray;/** * 注入列表形式(自动根据","分割) */@Value("${tools}")private List toolList;

Spring默认情况下会以“,”进行分割,转换成对应的数组或列表。

基于非配置文件注入

在使用实例说明基于非配置文件注入属性的实例之前,我们先了解一下SpEL。

SpEL(Spring Expression Language)即Spring表达式语言,可以在运行时查询和操作数据。使用#{...}作为定界符, 所有在大括号中的字符都将被认为是 SpEL。

下面看具体实例场景的应用:

/** * 注入普通字符串,相当于直接给属性默认值 */@Value("程序新视界")private String wechatSubscription;/** *  注入操作系统属性 */@Value("#{systemProperties['os.name']}")private String systemPropertiesName;/** * 注入表达式结果 */@Value("#{ T(java.lang.Math).random() * 100.0 }")private double randomNumber;/** * 注入其他Bean属性:注入config对象的属性tool */@Value("#{config.tool}")private String tool;/** * 注入列表形式(自动根据"|"分割) */@Value("#{'${words}'.split('|')}")private List numList;/** * 注入文件资源 */@Value("classpath:config.xml")private Resource resourceFile;/** * 注入URL资源 */@Value("http://www.choupangxia.com")private URL homePage;

在上述示例分别展示了以下场景的使用:

  • 直接注入字符串,相当于实例化时直接初始化字符串。
  • 通过#{}注入系统属性。
  • 通过#{}注入表达式结果。
  • 通过#{}注入其他Bean的属性。
  • 通过#{}和${}的组合注入属性并进行分割处理。
  • 注入文件资源,将对应的字符串值转换成对应的资源文件。
  • 注入URL资源,将对应的URL字符串转换成URL。

其中需要注意的是:

  • Resource的全限定名为org.springframework.core.io.Resource。
  • 二者结合使用时(#{'${}'}),注意单引号,注意不能反过来。

默认值注入

无论使用#{}或${}进行属性的注入,当无法获取对应值时需要设置默认值,可以采用如下方式来进行设置。

/** * 如果属性中未配置ip,则使用默认值 */@Value("${ip:127.0.0.1}")private String ip;/** * 如果系统属性中未获取到port的值,则使用8888。 */@Value("#{systemProperties['port']?:'8888'}")private String port;

其中${}中直接使用“:”对未定义或为空的值进行默认值设置,而#{}则需要使用“?:”对未设置的属性进行默认值设置。

本文首发来自微信公众号:程序新视界。一个软实力、硬技术同步学习的平台。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0x11 栈

【例题】Push,Pop,GetMin 手写一个栈 1 #include <iostream>2 #include <cstdio>3 #include <cmath>4 #include <cstring>5 #include <algorithm>6 #include <queue>7 using namespace std;8 const int maxn1000000;9 int stack[maxn], m[…

java war包合并,使用maven warpath插件合并多module的war包

查看原文&#xff1a;http://www.yeetrack.com/?p899现在java项目一般使用maven、gradle等工具来管理jar包、打包、发布。如果一个项目有很多模块&#xff0c;那般是分成多个module&#xff0c;主目录有个parent&#xff0c;负责包含全部的module&#xff0c;然后目录中多个mo…

儿童编程python入门_儿童编程python入门

经常会有小朋友问我&#xff0c;“我想做个黑客&#xff0c;我该学什么编程语言&#xff1f;”&#xff0c;或者有的小朋友会说&#xff1a;“我要学c&#xff0c;我要做病毒”。其实对于这些小朋友而言他们基本都没有接触过编程语言&#xff0c;只是通过影视或者其他地方看到的…

ARM GNU 常用汇编伪指令介绍

abort.abort: 停止汇编 .align absexpr1, absexpr2: 以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16 或 32. 第 二个表达式值表示填充的值. if...else...endif.if .else .endif: 支持条件预编译 include.include "file": 包含指定的头文件,…

java 同类型转换失败,你们见过java类型转换,自己转自己失败的情况吗?很神奇的操作...

问题就是上面这个问题。List slaughterProducts slaughterForm.getSlaughterProductModelForm();for (SlaughterProductModelForm e : slaughterProducts) {....}居然运行到for的时候出现上面这个错误。很神奇吧&#xff0c;工作这么多年了第一次发现 JAVA自己转自己转不成功。…

python可视化代码_python可视化实现代码

python可视化#导入两个库import numpy as npimport matplotlib.pyplot as plt#第一个参数就是x轴的初始值#第二个参数是x轴的终止值#第三个返回num均匀分布的样本&#xff0c;也就是0-12的区间取多少个点&#xff0c;如果为曲线的最好数值大一点x np.linspace(0, 12, 50)y np…

用户管理与文件权限

一&#xff1a;用户管理 现代操作系统一般属于多用户的操作系统&#xff0c;也就是说&#xff0c;同一台机器可以为多个用户建立账户&#xff0c;一般这些用户都是为普通用户&#xff0c;这些普通用户能同时登录这台计算机&#xff0c;计算机对这些用户分配一定的资源。 普通用…

php中划线,html中下划线、删除线、上划线的样式与用法实例

这篇文章主要介绍了下划线、删除线、上划线等常用的实例&#xff0c;划线是非常常见的一种样式&#xff0c;为了网页中的视觉效果以及对文字的说明&#xff0c;我们经常对文体进行一些划线操作。下面文章就是对各种划线的详细介绍。一. 下划线的详细介绍在我们日常的Web的开发中…

rabbitmq3.7集群搭建实战

环境&#xff1a; 3台 centos7.4rabbitmq3.7erlang 22 1. 有几种方式安装&#xff0c;这里使用的yum安装&#xff08;官方推荐&#xff09;2. 使用rabbitmq时需要安装erlang&#xff0c;在各个节点上使用vim添加两个repo文件**/etc/yum.repos.d/rabbitmq_erlang.repo**[rabbitm…

php获取页面中的指定内容,php 获取页面中指定内容的实现类

[email protected]image&#xff1a;Grep.class.php/** grep class* Date: 2013-06-15* Author: fdipzone* Ver: 1.0** Func:** set: 设置内容* get: 返回指定的内容* replace: 返回替换后的内容* get_pattern 根据type返回pattern*/class Grep{ // class startprivate $_patte…

数据增量更新定义_TiDB 在 OPPO 准实时数据仓库中的实践

作者介绍OPPO 数据分析与解决方案团队主要负责 OPPO 全集团的大数据分析和解决方案提供&#xff0c;团队成员多来自一线互联网公司及著名高校&#xff0c;在 OPPO 众多场景的大数据应用方面有很深经验&#xff0c;极大的支撑了业务迅速发展。文章具体作者&#xff1a;羊欢&…

Python之模块初识-自定义模块

1. 模块的定义与分类 什么是模块&#xff1f;一个模块就是一个py文件。 模拟博客园系统作业&#xff0c;100000行代码. 不可能全部存在一个文件. 不易维护.效率低.分文件: 10个文件.每个文件有50个函数,有一写相同功能或者相似功能的函数.代码冗余,重复性.我们应该将这10个函数…

php统计用户留存脚本,SQL 统计用户留存

问题描述有一个用来记录每日客户消耗数据的表 t&#xff0c;它的表结构如下&#xff1a;字段类型描述created_dayDate消耗日期customer_idInteger客户IDamountInteger消耗金额要求&#xff1a;统计出头部客户、腰部客户、尾部客户在上个月(2020-06-01 ~ 2020-06-30)的留存情况。…

python socket udp_python网络-Socket之udp编程(24)

一、udp简介udp --- 用户数据报协议&#xff0c;是一个无连接的简单的面向数据报的运输层协议。udp不提供可靠性&#xff0c;它只是把应用程序传给IP层的数据报发送出去&#xff0c;但是并不能保证它们能到达目的地。udp在传输数据报前不用在客户和服务器之间建立一个连接&…

selenium--单选下拉列表

下拉选择 from selenium import webdriver from time import sleepdriver webdriver.Chrome() driver.get("https://www.xxxxx.com/") sleep(2) driver.find_elements_by_tag_name(option)[2].click() # 通过标签名定位到 option 标签&#xff0c;选择第三个&#x…

matlab实现字符识别,字符识别 - MATLAB Simulink Example - MathWorks 中国

定义问题脚本 prprob 定义了一个包含 26 列的矩阵 X&#xff0c;每列对应一个字母。每列有 35 个值&#xff0c;值可能是 1&#xff0c;也可能是 0。每列(包含 35 个值)定义一个字母的 57 位图。矩阵 T 是一个 2626 的单位矩阵&#xff0c;它将 26 个输入向量映射到 26 个类。[…

python建立ip代理池_Python搭建代理IP池实现存储IP的方法

上一文写了如何从代理服务网站提取 IP&#xff0c;本文就讲解如何存储 IP&#xff0c;毕竟代理池还是要有一定量的 IP 数量才行。存储的方式有很多&#xff0c;直接一点的可以放在一个文本文件中&#xff0c;但操作起来不太灵活&#xff0c;而我选择的是 MySQL 数据库&#xff…

低秩矩阵分解 matlab,低秩分解的matlab代码看不懂,分解的两个矩阵在哪呀??...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼有四个文件&#xff1a;demo.mfunction [] demo()%This routine demonstrates an example of using LRR to do subspace segmentation. We cosntruct 5 independent subspaces, each of which has a rank of 10,%sample 200 point…

python深度神经网络算法_02.深度神经网络算法之Python基础与数据分析

资源内容&#xff1a;02.深度神经网络算法之Python基础与数据分析|____2016最新python基础篇视频教程22课|____Python学习手册(第4版).pdf|____Python程序入门与进阶|____基础篇01-福利课python先入为主上篇|____基础篇02-福利课python先入为主下篇|____基础篇03-虚拟机安装xub…

我们为什么要用MVC?ASP.NET MVC模式的优点?

1.关注点分离&#xff1a;每个功能最少会被切分为M-V-C三个部分&#xff0c;让开发者一次只需要关注一个部分&#xff0c;进而降低复杂难度&#xff0c;提高开发效率2.分层负责&#xff1a;明确切割&#xff0c;M-V-C三个部分并行开发3.自由操控HTML&#xff1a;在ASP.Net MVC中…