文档章节

微服务开发的入门级框架Spring Boot详解(二)

二十岁以后
 二十岁以后
发布于 2017/08/08 16:20
字数 1825
阅读 5272
收藏 225

1、Spring Boot的属性配置文件

        1.1 Spring Boot的属性配置文件的第一种形式

            使用properties配置文件,如下两个属性的含义是更改访问端口为8081,并且加了一个contextPath,可以理解为在地址栏多加层地址。

server.port=8081
server.context-path=/joyou

                右键点击DemoApplication.java ——》Run As ——》Spring Boot App启动程序

            效果如下,首先从日志上看,端口已经变为8081

            浏览器访问效果如下。

   

            补充:

            属性文件是最常见的管理配置属性的方式。Spring Boot 提供的 SpringApplication 类会搜索并加载 application.properties 文件来获取配置属性值。SpringApplication 类会在下面位置搜索该文件:

1.当前目录的/config子目录

2.当前目录

3.classpath 中的/config包

4.classpath

上面的顺序也表示了该位置上包含的属性文件的优先级。优先级按照从高到低的顺序排列。

可以通过spring.config.name这个key的配置属性来指定不同的属性文件名称。也可以通过spring.config.location来添加额外的属性文件的搜索路径

         1.2 Spring Boot的属性配置文件的第二种形式(推荐)

                    使用yml方式配置,在resources目录下建立application.yml文件。代码如下。

server:
  port: 8082
  context-path: /joyou

                效果与1.1相同。

                  补充:                   

                相对于属性文件来说,YAML 是一个更好的配置文件格式。当有前缀的情况下,使用.yml格式的配置文件更简单。

注意:使用.yml时,属性名的值和冒号中间必须有空格,如name: SpringBoot正确,SpringBoot就是错的。

YAML 在 Ruby on Rails 中得到了很好的应用。YAML是JSON的一个超集,也是一种方便的定义层次配置数据的格式。它的基本语法规则如下:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略。

         1.3 application.properties里面到底有哪些key是可配置的?

        在SpringBoot官网文档给出了详尽的配置以及说明。在Appendix A. Common application properties中:http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#common-application-properties

            不完全统计,这个完整的application properties文件,有1183行。其中,属性key有950个。当你看到如此庞大的配置,你一定会被吓到。不过,在实际项目中,我们如果遵循Spring Boot的约定,通常不需要我们单独指定太多配置。

            1.4 关于配置的优先级

            Spring Boot提供了一种优先级配置读取的机制来帮助我们从这种困境中走出来。

            Spring Boot 所提供的配置优先级顺序比较复杂。按照优先级从高到低的顺序,具体的列表(从高到低)如下所示。

  •             1.命令行参数(优先级最高)。
  •             2.通过 System.getProperties() 获取的 Java 系统参数。
  •             3.操作系统环境变量。
  •             4.从 java:comp/env 得到的 JNDI 属性。
  •             5.通过 RandomValuePropertySource 生成的random.*属性。
  •             6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件,通过spring.config.location参数指定
  •             7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  •             8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  •             9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
  •             10.应用 Java配置类,包含@Configuration注解的 Java 类,通过@PropertySource注解声明的属性文件。
  •             11.通过SpringApplication.setDefaultProperties声明的默认属性。

            如果Spring Boot在优先级更高的位置找到了配置,那么它就会忽略优先级低的配置。下面我们简单讲讲这些优先级。Spring Boot 的这个配置优先级看似复杂,其实是很合理的。命令行参数的优先级之所以被设置为最高,是因为可以方便我们在测试或生产环境中快速地修改配置参数值,而不需要重新打包和部署应用。

            SpringApplication 类默认会把以“--”开头的命令行参数转化成应用中可以使用的配置参数,如 “--name=Alex” 会设置配置参数 “name” 的值为 “Alex”。

            如果不需要这个功能,可以通过SpringApplication.setAddCommandLineProperties(false)

禁用解析命令行参数。

2、Spring Boot自定义属性

                2.1、 第一个自定义属性的例子  

                          在实际开发过程中,需要程序去配置文件中读取数据(如:URL,一些账号密码等),所以就需要我们来自定义属性,供程序读取。

                        首先在yml里自定一个属性,格式如下:

company: joyou
employee: 二十岁以后

                        在Java程序中取值,代码如下:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloSpringBoot {
	
	@Value("${company}")
	private String company;
	
	@Value("${employee}")
	private String employee;
	

	@RequestMapping(value="/hello" , method = RequestMethod.GET)
	public String HelloSpring(){
		
			return company+"====="+employee;
	}
}

                使用浏览器访问效果如下

                2.2 在自定义属性中调用其他属性

                        yml文件中的配置               

company: joyou
employee: 二十岁以后
   
All: "公司: ${company} , 员工: ${employee}"  

                    在JAVA程序中注入All属性

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloSpringBoot {
	
	@Value("${All}")
	private String All;
	
	
	@RequestMapping(value="/hello" , method = RequestMethod.GET)
	public String HelloSpring(){
		
			return All;
	}
}

            效果如图所示:

            2.3 对于多个属性如何一次调用

                    看了上面的例子后,会产生一个疑问,如果想一次调用10个、20个、50个属性值,难道我要在程序中注入50次值,使用50次注解吗? 为了解决这个疑问,Spring Boot 是这么解决的!

                    首先一个女孩,有身高、体重、罩杯等等属性,我们可以这样来写!

Girl: 
   High: 160CM
   Weight: 80KG
   CupSize: 30A

                    然后写一个类,这个类中提供Girl的属性,及Setter,Geter方法,需要使用两个注解:

  •                     @Component //如果没有这个注解,会报找不到Bean的错
  •                     @ConfigurationProperties(prefix="Girl") //找到以Girl开头的属性

 

                    然后在java程序中注入Gril类

package com.example.demo;

@RestController
public class HelloSpringBoot {

	@Autowired
	private Girl girl;
	
	
	@RequestMapping(value="/hello" , method = RequestMethod.GET)
	public String HelloSpring(){
		
			return girl.toString();
	}
}

                启动程序,刷新浏览器,效果如下:

3、多环境的属性配置

            3.1 生产与开发的不同场景

                    面对生产与开发的不同场景,对于一些属性的值可能不同,难道我要在开发环境写的属性值,到生产环境在一个一个改吗?既然都这么说了,那当然是不用的了。我们可以在开发时候就写好两套环境中对于属性值不同需求的yml文件,然后在调用需要的yml文件就好了。

                对于生产环境Girl的属性值如下:

                对于开发环境Girl的属性值如下:

                我只需要在application.yml中调用不同的文件就好了,dev这个值是我开发和生产环境不同yml文件的后缀名(注意看上面两个图文件的命名

    浏览器对应的结果

            第二种环境对应的配置

        浏览器对应的结果

补一张到目前为止的项目目录结构,帮助理解

© 著作权归作者所有

共有 人打赏支持
二十岁以后
粉丝 230
博文 25
码字总数 23016
作品 0
海淀
架构师
加载中

评论(26)

雨风花叶年暮朝
在配置文件里面配置好对象的属性后,运行程序,为啥会报Configuration property name 'Girl' is not valid:
Invalid characters: 'G'这种异常??
t
tomrichdow
Java微服务实践—Spring Boot系列
网盘地址:https://pan.baidu.com/s/13mLaKrun7oZGzokkqmKgbg 密码: qjmq
月夜筱风
月夜筱风

引用来自“月夜筱风”的评论

30A

引用来自“Latermm”的评论

因为一直健身,第一个例子里的女孩 巨胖,还没发育
第二个 30kg 除了骨头就是胸了吧
污了
咱们2个关注点是不是跟其他人不一样:flushed:
Latermm
Latermm

引用来自“月夜筱风”的评论

30A
因为一直健身,第一个例子里的女孩 巨胖,还没发育
第二个 30kg 除了骨头就是胸了吧
污了
猪哥哥0815
猪哥哥0815
写的真的太好了,非常感谢
hugeo
hugeo
自己尝试的时候发现要使用@ConfigurationProperties注解,需要引入依赖:
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>
文章中木有提到,是漏了吗
xmlspyspring
xmlspyspring
属性名首字母大写不能忍
二十岁以后
二十岁以后
没明白什么意思?指的是应用的配置文件吗?文章里有说怎么更改的
郭大侠
郭大侠
请问:部署的时候如何指定当前环境是生产还是开发模式?
Dylan1009
Dylan1009

引用来自“二十岁以后”的评论

引用来自“沐火浴风”的评论

以前是不是做.net的啊,喜欢首字母大写

引用来自“二十岁以后”的评论

....不是,我今年七月份刚毕业,大专生。大二的时候实习开发也是java。我是之前看过阿里的开发手册,里面有很多规范。

引用来自“Dylan1009”的评论

加油!刚毕业就能写这么好的学习文档,我是来学习的,我毕业了好几年,惭愧……
爱好是最好的老师,这句话我觉得说的很对!我也是个小学生,还有很多要跟大家学习,共同努力!

回复@二十岁以后 : 能 写一份好文档,只知道有多重要吗,真的,能写出一份好文档在工作中太重要了
学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow
05/28
0
0
微服务资源springboot、springcloud、docker、dubbo项目实战等倾心分享

精彩内容 java实战练习项目教程 全网最全电子图书分享 你所需要的大数据视频教程 java学习视频教程及源码 今天又是周末,还是想给大家送一些福利,因为最近一直有小伙伴问我要springboot等微...

公众号_好好学java
08/06
0
0
Spring Boot与Spring Cloud是什么关系?

SpringBoot先于Spring Cloud问世。 SpringBoot相当于脚手架,借助他可以快速搭建房子,它本身不具备任何功能属性,值是普通房间,没有其他任何功能。 什么是Spring Boot Spring Boot简化了基...

远方的梦Java
08/05
0
0
10分钟入门SpringBoot

SpringBoot是基于spring框架衍生的一种新的微服务框架,如果对Spring有一定了解的同学肯定知道在Spring中需要配置各种xml文件完成bean的注册操作,随着服务越来越多,配置就变得越来越复杂,...

jwfy
06/14
0
0
用IDEA搭建springboot+thymleaf+mybatis(附分页方法)

参考thymleaf官方网址: 现在主流的微服务springboot配合H5开发效率极快。也符合现在前后端分离的开发方式。 thymleaf作为页面模板框架,可以更好的处理Controller和html的关系。 具体搭建过程...

HaleyLiu
05/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Go语言_通神之路(2)

1、包 每个Go程序都是由包构成,从main包开始运行,就是我上一篇讲到的,都是从main函数开始执行,但是必须在main包下面! package mainimport ( "fmt" "math/rand")func ...

木九天
昨天
5
0
51.php-fpm的pool 慢日志 open_basedir 进程管理

12.21 php-fpm的pool 12.22 php-fpm慢执行日志(测试时报错) 12.23 open_basedir 12.24 php-fpm进程管理 12.21 php-fpm的pool: php-fpm里的pool也叫池子,咱们之前加入过www的配置,这个w...

王鑫linux
昨天
0
0
java内存模型概述

1、Java虚拟机运行时数据分区图 程序计数器:线程私有,是一块较小的内存空间,它是当前线程所执行的字节码文件的行号指示器 java虚拟机栈:线程私有,其生命周期与线程相同,这也就是我们平...

京一
昨天
1
0
shell学习之test语法

因为if-then语句不能测试退出状态码之外的条件,所以提供了test, 如果test命令中列出的条件成立,test命令就会退出并返回退出状态码0;如果条件不成立,test命令就会退出并返回非零的退出状态...

woshixin
昨天
0
0
openJDK之如何下载各个版本的openJDK源码

如果我们需要阅读openJDK的源码,那么需要下载,那么该去哪下载呢? 现在JDK已经发展到版本10了,11已经处于计划中,如果需要特定版本的openJDK,它们的下载链接在哪呢? 1.openJDK的项目 链接...

汉斯-冯-拉特
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部