该篇为Sping Boot入门到实战系列入门篇的第三篇。介绍Spring Boot的属性配置。
 
  传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文件名自定义),然后在xml配置中通过
  1. <util:properties id="demoProps" location="classpath:demo.properties" />

引入属性文件。再定义一个Bean来读取这些属性,Bean配置:

  1. <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  2. <property name="staticMethod" value="包名.DemoUtil.init" />
  3. <property name="arguments">
  4. <list>
  5. <ref bean="demoProps" />
  6. </list>
  7. </property>
  8. </bean>

Bean定义:

  1. public class DemoUtil {
  2. private static Properties properties;
  3. static void init(Properties props) {
  4. properties = props;
  5. }
  6. public static String getValue(String key){
  7. return properties.getProperty(key);
  8. }
  9. }

在其它地方通过DemoUtil.getValue()方法来访问具体某个属性的值。

 
  Spring Boot中,可以在多个地方配置属性,包括properties文件,yaml文件,环境变量, 系统属性,命令行参数等, 这些属性都会被Spring Boot加到Environment中,可通过@Value注解,Environment 实例,或 @ConfigurationProperties注解的类来访问。
 
 
  属性加载优先级顺序:
  1. 如果有使用devtools,devtools 全局设置的属性(用户目录 ~/.spring-bootdevtools.properties)
  2. 测试类的注解@TestPropertySource
  3. 测试类属性注解 @SpringBootTest#properties
  4. 命令行参数
  5. SPRING_APPLICATION_JSON里的属性(环境变量或系统属性)
  6. ServletConfig初始化参数
  7. ServletContext初始化参数
  8. JNDI参数   java:comp/env
  9. Java系统属性  System.getProperties()
  10. 操作系统环境变量
  11. RandomValuePropertySource 配置的属性 random.*
  12. jar包外部的applictaion-{profile}.properties,applictaion-{profile}.yml配置文件
  13. jar包内部的applictaion-{profile}.properties,applictaion-{profile}.yml配置文件
  14. jar包外部的applictaion.properties,applictaion.yml配置文件
  15. jar包内部的applictaion.properties,applictaion.yml配置文件
  16. @Configuration类上的 @PropertySource注解指定的配置文件
  17. 默认属性: SpringApplication.setDefaultProperties
 上述属性配置,除了红色标注的外,其它一般应用较少。序号低的配置优先级高于序号高的配置,即如果存在相同属性配置 ,则序号低的配置会覆盖序号高的配置。
 
  配置属性
  1. 命令行参数
  启动Spring Boot应用时,可以指定命令行参数,如:
  1. java -jar springboot-demo-properties.jar --my.name=command_line_devlink

  该参数值将会覆盖应用其它地方的同名属性配置值。命令行参数放在xx.jar 的后面。

  可以通过SpringApplication.setAddCommandLineProperties(false)  禁用命令行参数配置
 
  2. Java系统属性
  同样在启动Spring Boot应用时,可以指定Java系统属性,如:
  1. java -Dmy.name=system_properties_devlink -jar springboot-demo-properties.jar

  Java系统属性放在java命令之后。

 
  3. 操作系统环境变量
  配置过JAVA_HOME的应该理解何为环境变量。某些操作系统可能不支持.分隔的属性名,可以改为以下划线连接。Spring Boot将myName, my.name, MY_NAME视为等效。
 
  4. 应用属性配置文件(.properties文件或 .yml文件)
  .properties文件属性配置格式:
  1. my.name=devlink
  2. my.list[0]=aaa //配置列表
  3. my.list[1]=bbb

  .yml文件属性配置格式:

  1. my:
  2. name: devlink
  3. list: //配置列表
  4. - aaa
  5. - bbb

yml中,属性名与值之间冒号后面必须有空格。

  应用属性配置文件位置:
  1. jar包所在当前目录下的子目录/config
  2. jar包所在当前目录
  3. classpath根目录下的子目录/config
  4. classpath根目录
序号低的优先级高于序号高的优先级,即jar包外的配置优先级高于jar包内的配置。同一目录下,.properties文件的优先级高于.yml文件。application-{profile}.properties的优先级高于application.properties。
 
  访问属性
  1. 类中属性上添加 @Value("${xx}") 注解方式。如:
  1. @Value("${my.name}")
  2. private String myName;

可以指定默认值,如 @Value("${my.gender:f}"), 当my.gender未配置时,默认使用值"f"

 
  2. 通过@ConfigurationProperties注解的类来访问。如定义:
  1. @Configuration
  2. @ConfigurationProperties(prefix = "my")
  3. public class MyConfig {
  4. private String name;
  5. getter/setter;
  6. }

  然后在需要访问的Bean中,通过@Autowired 注入MyConfig实例,通过getName()方法即可访问my.name属性值。

 
  3. 通过Environment 实例访问。如:
  1. @Autowired
  2. private Environment env;

  然后调用env.getProperty("my.name")访问。

 
 

Sping Boot入门到实战之入门篇(三):Spring Boot属性配置的更多相关文章

  1. Sping Boot入门到实战之入门篇(一):Spring Boot简介

    该篇为Spring Boot入门到实战系列入门篇的第一篇.对Spring Boot做一个大致的介绍. 传统的基于Spring的Java Web应用,需要配置web.xml, applicationCo ...

  2. Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置

    该篇为Sping Boot入门到实战系列入门篇的第四篇.介绍Spring Boot自动化配置的基本原理与实现.   Spring Boot之所以受开发者欢迎, 其中最重要的一个因素就是其自动化配置特性 ...

  3. Sping Boot入门到实战之入门篇(二):第一个Spring Boot应用

    该篇为Spring Boot入门到实战系列入门篇的第二篇.介绍创建Spring Boot应用的几种方法. Spring Boot应用可以通过如下三种方法创建: 通过 https://start.spr ...

  4. xgboost入门与实战(原理篇)

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  5. Spring Boot入门篇(基于Spring Boot 2.0系列)

    1:概述: Spring Boot是用来简化Spring应用的初始化开发过程. 2:特性: 创建独立的应用(jar|war形式); 需要用到spring-boot-maven-plugin插件 直接嵌 ...

  6. Spring Cloud实战 | 第十篇 :Spring Cloud + Seata 1.4.1 + Nacos1.4.0 整合实现微服务架构中逃不掉的话题分布式事务

    Seata分布式事务在线体验地址:https://www.youlai.store 本篇完整源码地址:https://github.com/hxrui/youlai-mall 有想加入开源项目开发的童 ...

  7. Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制

    一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...

  8. [Spring Cloud实战 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT实现微服务统一认证授权

    一. 前言 本篇实战案例基于 youlai-mall 项目.项目使用的是当前主流和最新版本的技术和解决方案,自己不会太多华丽的言辞去描述,只希望能勾起大家对编程的一点喜欢.所以有兴趣的朋友可以进入 g ...

  9. Spring Cloud实战 | 最八篇:Spring Cloud +Spring Security OAuth2+ Axios前后端分离模式下无感刷新实现JWT续期

    一. 前言 记得上一篇Spring Cloud的文章关于如何使JWT失效进行了理论结合代码实践的说明,想当然的以为那篇会是基于Spring Cloud统一认证架构系列的最终篇.但关于JWT另外还有一个 ...

随机推荐

  1. [one day one question] nodejs require 缓存,无法检测文件变化

    问题描述: nodejs require 缓存,无法检测文件变化,当文件require引入后,当文件发生变动后即使再次使用require,返回的依然是第一次引入的文件内容,这怎么破? 解决方案: de ...

  2. char,varchar,nvarchar,text区别与联系

    CHAR,NCHAR 定长,速度快,占空间大,需处理VARCHAR,NVARCHAR,TEXT 不定长,空间小,速度慢,无需处理NCHAR.NVARCHAR.NTEXT处理Unicode码

  3. 推荐一款强大的3D家装开源软件

    2015年家装o2o着实火了一把.家装涉及到上门量尺,再设计,这个过程是免不了的. 目前基于bs架构的酷家乐,爱福窝等,流行起来就是着力于这点,通过一个点寻找突破口,进入深度挖掘,带动其他家具等产品来 ...

  4. linux 如何降低入向软中断占比

    最近遇到一个问题,当tcp收包的时候,我们的服务器的入向软中断比例很高. 我们知道,napi模式,可以降低收包入向软中断占比,那么,针对napi模式,能不能优化?本文针对2.6.32-358内核进行分 ...

  5. 自定义jstl fn函数fns

    1.引入函数声明: jsp页面需要引入自定义fns函数声明:<%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld&q ...

  6. linkin大话面向对象--闭包和回调

      先来理解2个概念:闭包和回调   什么是闭包? 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为他不仅包含了外部类对象的信 ...

  7. alwaysOn中关于维护计划的应用方案

    由于alwaysOn环境下主副本所在的实际服务器不固定, 所以我目前采取的方案是创建维护计划的时候, 在各个服务器上创建一份维护计划. (假设有2个服务器需要故障转移, 那么就在这两个服务器上分别创建 ...

  8. Mysql的主从配置

    前言:这次学习分布式的思想要配置mysql的主从复制和读写分离,我在主从配置上踩到很多坑,在此演示一遍配置过程,并附上问题的说明和自己的一些见解 Mysql主从复制的原理 附上原理图: mysql的主 ...

  9. web.xml 中CharacterEncodingFilter类的学习

    过滤器配置 当前台JSP页面和JAVA代码中使用了不同的字符集进行编码的时候就会出现表单提交的数据或者上传/下载中文名称文件出现乱码的问题 //编码方式配置 <filter> <fi ...

  10. 【转】 SED多行模式空间

    1. sed执行模板=sed '模式{命令1;命令2}' 即逐行读入模式空间,执行命令,最后输出打印出来 2. 为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间 ...