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

目录
  • 今天学习到了SpringBoot 的属性赋值@Value用法
    • 先总结
    • 例子
  • @Value的使用及注意事项
    • 为什么使用
    • 参数形式
    • 前置条件(注意事项)

今天学习到了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的方式是不会自动注入这些配置的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring@Value属性注入使用方法解析

    这篇文章主要介绍了Spring@Value属性注入使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在使用Spring框架的项目中,@Value是使用比较频繁的注解之一,它的作用是将配置文件中key对应的值赋值给它标注的属性.在日常使用中我们常用的功能都比较简单,本篇文章系统的带大家来了解一下@Value的使用方法. @Value注入支持形式 @Value属性注入功能根据注入的内容来源可分为两类:通过配置文件的属性注入和通过非配置文件

  • 基于Spring boot @Value 注解注入属性值的操作方法

    本文主要介绍Spring @Value 注解注入属性值的使用方法的分析,文章通过示例代码非常详细地介绍,对于每个人的学习或工作都有一定的参考学习价值 在使用spring框架的项目中,@Value是经常使用的注解之一.其功能是将与配置文件中的键对应的值分配给其带注解的属性.在日常使用中,我们常用的功能相对简单.本文使您系统地了解@Value的用法. @Value注入形式 根据注入的内容来源,@ Value属性注入功能可以分为两种:通过配置文件进行属性注入和通过非配置文件进行属性注入. 非配置文件注

  • 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的用法说明

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

  • SpringBoot中属性赋值操作的实现

    说明:当程序中出现频繁变化的数据时,如果采用认为的方式进行修改并且编译打包则会导致代码的耦合性较高,不便于维护!所以能否为属性动态赋值? 属性固定值 //动态获取ip和端口数据 /** * @responseBody * 注解作用: * 1.将对象转化成Json格式, * 2.如果返回值是String类型,则返回字符串本身 * 3.一般客户端发起ajax请求时,采用该注解返回数据,将不会执行视图解析器操作 */ @RestController public class RedisControll

  • Jquery attr()方法 属性赋值和属性获取详解

    jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到attr(),attr()有4个表达式. 1.  attr( 属性名 )        //获取属性的值(取得第一个匹配元素的属性值.通过这个方法可以方便地从第一个匹配元素中获取一个属性的值.如果元素没有相应属性,则返回 undefined ) 2.  attr( 属性名, 属性值 )    //设置属性的值 (为所有匹配的元素设置一个属性值.) 3.  att

  • JQuery属性操作与循环用法示例

    本文实例讲述了JQuery属性操作与循环用法.分享给大家供大家参考,具体如下: 取出或者设置html内容 var $htm= $("#div").html  取出 $("#div").html("<span>文字</span>")  设置 取出或者设置某个属性的值 var $src=$('#img1').prop('src')  取出 $('#img1').prop({src:'test.jpg',alt:"te

  • Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析

    本文实例讲述了Python面向对象程序设计之静态方法.类方法.属性方法原理与用法.分享给大家供大家参考,具体如下: 前言:认为方法与函数同意义,由于这里使用method,所以称为方法 静态方法: 使用@staticmethod来定义静态方法. 静态方法:类和实例都可以调用的方法,实际上跟类没什么关系了,对于这种不太相关的就使用静态方法[用实例和类调用没有区别] class Dog(object): def __init__(self,name): self.name=name def talk(

  • 浅谈springboot中tk.mapper代码生成器的用法说明

    问:什么是tk.mapper? 答:这是一个通用的mapper框架,相当于把mybatis的常用数据库操作方法封装了一下,它实现了jpa的规范,简单的查询更新和插入操作都可以直接使用其自带的方法,无需写额外的代码. 而且它还有根据实体的不为空的字段插入和更新的方法,这个是非常好用的哈. 而且它的集成非常简单和方便,下面我来演示下使用它怎么自动生成代码. pom中引入依赖,这里引入tk.mybatis.mapper的版本依赖是因为在mapper-spring-boot-starter的新版本中没有

  • SpringBoot + MapStruct 属性映射工具的使用详解

    1. MapStruct 是什么? 截取下官方的原话 我给翻译了一下 说白了 当你的对象A有几十个属性 而另一个对象B 与A比较只有一些细微的差别 那么这时候只需要映射过去即可 而不需要疯狂的调用set方法 进行属性的拷贝 这就是这个工具给我们带来的最大便利 官方github链接 点击跳转 2. 引入依赖 采用Mapstruct的 最新版本 1.4.2.Final SpringBoot版本不要选新版的 我对比了下 2.3.0 和 2.5.4 后者会出现属性映射为null的情况 已经将问题反馈了

  • python中string模块各属性以及函数的用法介绍

    任何语言都离不开字符,那就会涉及对字符的操作,尤其是脚本语言更是频繁,不管是生产环境还是面试考验都要面对字符串的操作. python的字符串操作通过2部分的方法函数基本上就可以解决所有的字符串操作需求: • python的字符串属性函数 • python的string模块 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1.字符串属性函数  系统版本:CentOS release 6.2 (Final)2.6.32-220.

  • 详解Hibernate cascade级联属性的CascadeType的用法

    详解Hibernate cascade级联属性的CascadeType的用法 cascade(级联) 级联在编写触发器时经常用到,触发器的作用是当 主控表信息改变时,用来保证其关联表中数据同步更新.若对触发器来修改或删除关联表相记录,必须要删除对应的关联表信息,否则,会存有脏数据.所以,适当的做法是,删除主表的同时,关联表的信息也要同时删除,在hibernate中,只需设置cascade属性值即可. cascade表示级联操作,在hibernate配置注解@OneToOne,@OneToMany

  • MyBatis拦截器:给参数对象属性赋值的实例

    该拦截器的作用:在进行增加.修改等操作时,给数据模型的一些通用操作属性(如:创建人.创建时间.修改人.修改时间等)自动赋值. 该实现是在DAO层拦截,即存入DB前最后一层.后经分析,不是很合理,改为在service层拦截,用spring AOP来实现了,该代码遂弃用.不过已经测试可用,记录备忘. package com.development; import java.lang.reflect.InvocationTargetException; import java.util.Date; i

随机推荐