SpringBoot的属性赋值@Value的用法说明
作者:qq_41075649 发布时间:2023-10-16 13:08:27
今天学习到了SpringBoot 的属性赋值@Value用法
先总结
@Value(" 张三 ")
:直接附在属性名上,在Bean初始化时,会赋初始值@Value(" #{ 20 - 2 } ")
:可以用 #{ },里面可以写表达式,当然也可以直接 @Value(" #{ 18 } ") 或 @Value(" 18 ")@Value(" ${ person.name } ")
:利用 ${ } 可以取出配置文件中的值
例子
配置类:
@PropertySource(value={"classpath:/person.properties"})
@Configuration
public class MainConfigOfPropertyValues {
?
?? ?@Bean
?? ?public Person person() {
?? ??? ?return new Person();
?? ?}?? ?
}
@Configuration
:告诉 Spring 这是一个配置类@PropertySource
:关联配置文件,使用 @PropertySource 指定读取外部配置文件,保存到运行的环境变量中,然后可以用@Value(" ${ person.name } ") 获取环境变量中的值。
Bean :
public class Person {?
?? ?/*
?? ? * 使用@Value赋值:
?? ? * ?? ?1. 基本数值
?? ? * ?? ?2. 可以写 #{ }
?? ? * ?? ?3. 可以写 ${ },取出配置文件{properties}中的值
?? ? */
?? ?
?? ?@Value("张三")
?? ?private String name;
?? ?@Value("#{20-2}")
?? ?private int age;
?? ?@Value("${person.nickName}")
?? ?private String nickName;
?? ?
?? ?public String getNickName() {
?? ??? ?return nickName;
?? ?}
?? ?public void setNickName(String nickName) {
?? ??? ?this.nickName = nickName;
?? ?}
?? ?public String getName() {
?? ??? ?return name;
?? ?}
?? ?public void setName(String name) {
?? ??? ?this.name = name;
?? ?}
?? ?public int getAge() {
?? ??? ?return age;
?? ?}
?? ?public void setAge(int age) {
?? ??? ?this.age = age;
?? ?}
?? ?@Override
?? ?public String toString() {
?? ??? ?return "Person [name=" + name + ", age=" + age + ", nickName=" + nickName + "]";
?? ?}
?? ?public Person(String name, int age, String nickName) {
?? ??? ?super();
?? ??? ?this.name = name;
?? ??? ?this.age = age;
?? ??? ?this.nickName = nickName;
?? ?}
?? ?public Person() {
?? ??? ?super();
?? ??? ?// TODO Auto-generated constructor stub
?? ?}?? ?
}
配置文件:
person.nickName=\u5C0F\u4E09
这里面的 \u5C0F\u4E09 表示的是“小三”
而配置文件的位置:
运行:
public class IOCTest_PropertyValue {
//容器创建
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfPropertyValues.class);
//打印容器中Bean的name
private void printBeans(AnnotationConfigApplicationContext applicationContext) {
String[] definitionName = applicationContext.getBeanDefinitionNames();
for(String name : definitionName) {
System.out.println(name);
}
}
@Test
public void test01() {
printBeans(applicationContext);
System.out.println("-------------------------------------------------------");
//获得容器中的Person
Person person = (Person) applicationContext.getBean("person");
System.out.println(person);
//获得环境变量中的值
ConfigurableEnvironment environment = applicationContext.getEnvironment();
String property = environment.getProperty("person.nickName");
System.out.println("环境变量:"+property);
applicationContext.close();
}
}
运行结果:
@Value的使用及注意事项
为什么使用
使用@Vlue可以实现对于线上项目的一些通用配置的修改;或者修改项目中可能出现变动,但是却又有很多地方都在使用的一些参数,这样我们我可直接通过修改配置文件而不用修改代码的方式来达到参数的修改的目的
参数形式
yml文件
(简单的参数)
test1:
? ? ?num: 1
? ? ?name: xiaoming
获取数据
@Value("${test1.num}")
private int num;
@Value("${test1.name}")
private String name;
(数组||集合)
test:
? array1: aaa,bbb,ccc
? array2: 111,222,333
? array3: 11.1,22.2,33.3
? list1: ddd,eeee,111,333,222,444
获取数据
//数组
@Value("${test.array1:}")
private String[] array1;
//集合
@Value("#{'${test.list1:}'.split(',')}")
private List<String> list1;
//集合进一步做空数据处理
@Value("#{'${test.list:}'.empty ? null : '${test.list:}'.split(',')}")
private List<String> testList;
(Map)
test:
? map1: '{"name": "zhangsan", "sex": "male"}'
? map2: '{"math": "90", "english": "85"}'
获取数据
@Value("#{${test.map2}}")
private Map<String,String> map1;
@Value("#{${test.map2}}")
private Map<String,Integer> map2;
前置条件(注意事项)
想要能够很好的使用的使用@Value 需要注意一些前置条件
1. 使用正确的注解
@Value的使用要找对目标,我们所使用的注解的引用时这样的
2. yml文件的格式
如果你使用的是yml文件的话,需要注意yml文件的注意格式问题 ,基本上参数名之后的冒号之后都要加空格,一般情况下,冒号后面加了空格,参数名都会变为蓝色
3. @Value使用的环境要求
不能作用于静态变量(static);
不能作用于常量(final);
不能在非注册的类中使用(类需要被注册在spring上下文中,如用@Service,@RestController,@Component等);
使用这个类时,只能通过依赖注入的方式,用new的方式是不会自动注入这些配置的。
来源:https://blog.csdn.net/qq_41075649/article/details/83419588
猜你喜欢
- 本文实例讲述了Android观察者模式。分享给大家供大家参考。具体分析如下:一、环境:主机:WIN8开发环境:Eclipse二、说明:1.打
- 看到这个sweet-alert-dialog很亲切,因为前端开发本人用的提示就是这个js插件,java牛人很厉害,直接弄成一个java包插件
- 前言最近做项目的时候遇到一个卡劵的效果,由于自己觉得用图片来做的话可以会出现适配效果不好,再加上自己自定义view方面的知识比较薄弱,所以想
- SpringCloud Zuul 是SpringCloud系列的网关实现,具有均衡负载,将非业务性校验剥离出来,使微服务专注于业务的一个组件
- 最近有一个项目要用到年份周期,用于数据统计图表展示使用,当中用到年份周期,以及年份周期所在的日期范围。当初设想通过已知数据来换算年份周期,经
- 本文实例为大家分享了java实现打字游戏的具体代码,供大家参考,具体内容如下import java.util.Random;import j
- public class Count { public static void main(String[] args) { int i =
- 上一节是把大概的流程给过了一遍,但是还有很多地方没有说到,后续的慢慢会涉及到,敬请期待!这次我们说说垃圾收集器,又名gc,顾名思义,就是收集
- 先看看代码再说:package com.b510.note; import java.math.BigInteger;
- 这篇文章主要介绍了springboot如何使用AOP做访问请求日志,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 相信大家一定都使用过手机QQ和微信之类的软件,当我们使用时不难发现其界面的切换不仅可以通过点击页标签来实现,还可以通过左右滑动来实现的,耗子
- 1.更新MAC地址 将注册表中的键值添加上MAC地址2.重新连接网络 试过了3个方法: Ma
- java解析json数组最简单的json数组[ { &quo
- 前言上篇文章我们介绍了抽象化磁盘文件的 File 类型,它仅仅用于抽象化描述一个磁盘文件或目录,却不具备访问和修改一个文件内容的能力。Jav
- 本文实例为大家分享了Java使用单链表实现约瑟夫环的具体代码,供大家参考,具体内容如下构建一个单向的环形链表思路1.先创建第一个节点, 让f
- package com.java.db;import java.lang.reflect.Constructor;import java.l
- 本文实例为大家分享了Android创建自定义样式圆角dialog对话框的具体代码,供大家参考,具体内容如下效果如上,圆角对话框,标题和正文都
- 在我们现在开发APP过程中,当用户注册时,短信验证是必不可少的操作,这里我们就是用一个免费的第三方短信验证SDK-MOP首先看下效果图 获取
- 引言什么是Parser CombinatorParser Combinator是函数式语言中的概念,它是一种通过组合小型解析器来构建复杂解析
- 各位小伙伴们大家早上好,不知道你的《第三行代码》已经读到哪里了?有些朋友的阅读速度真是令人印象深刻,我记得在《第三行代码》刚刚发售一周不到的