微服务开发的入门级框架Spring Boot详解(二)
微服务开发的入门级框架Spring Boot详解(二)
二十岁以后 发表于4个月前
微服务开发的入门级框架Spring Boot详解(二)
  • 发表于 4个月前
  • 阅读 4853
  • 收藏 217
  • 点赞 4
  • 评论 24

腾讯云 技术升级10大核心产品年终让利>>>   

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文件的后缀名(注意看上面两个图文件的命名

    浏览器对应的结果

            第二种环境对应的配置

        浏览器对应的结果

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

共有 人打赏支持
粉丝 194
博文 14
码字总数 14335
评论 (24)
高小北
配置目录有两个aapplication.文件,yml和properties程序会认哪个?
二十岁以后

引用来自“高小北”的评论

配置目录有两个aapplication.文件,yml和properties程序会认哪个?
properties,亲测。
二十岁以后

引用来自“高小北”的评论

配置目录有两个aapplication.文件,yml和properties程序会认哪个?
补充一下,如果同时存在,但是你的properties文件中什么都没写的话,YML文件中的配置则生效
进击的代码
纠错一下,第一段的配置里面写得是8082...
进击的代码
但是文字第一段描述的是8081
二十岁以后

引用来自“进击的代码”的评论

纠错一下,第一段的配置里面写得是8082...
感谢纠错,已经改正!
进击的代码

引用来自“进击的代码”的评论

纠错一下,第一段的配置里面写得是8082...

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

感谢纠错,已经改正!
握爪~~多多向你学习~
沐火浴风
以前是不是做.net的啊,喜欢首字母大写
阿信sxq
不错,写得很详细
二十岁以后

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

以前是不是做.net的啊,喜欢首字母大写
....不是,我今年七月份刚毕业,大专生。大二的时候实习开发也是java。我是之前看过阿里的开发手册,里面有很多规范。
二十岁以后

引用来自“阿信sxq”的评论

不错,写得很详细
感谢支持,我会更负责认真的写。
beyondforever68
就因为yaml不能使用tab缩进,我继续使用properties配置文件
月夜筱风
30A
夕拾贰
把Spring Boot定位入门级框架不太合适吧。
Dylan1009

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

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

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

....不是,我今年七月份刚毕业,大专生。大二的时候实习开发也是java。我是之前看过阿里的开发手册,里面有很多规范。
加油!刚毕业就能写这么好的学习文档,我是来学习的,我毕业了好几年,惭愧……
二十岁以后

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

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

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

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

引用来自“Dylan1009”的评论

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

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

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

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

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

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

引用来自“Dylan1009”的评论

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

回复@二十岁以后 : 能 写一份好文档,只知道有多重要吗,真的,能写出一份好文档在工作中太重要了
郭大侠
请问:部署的时候如何指定当前环境是生产还是开发模式?
二十岁以后
没明白什么意思?指的是应用的配置文件吗?文章里有说怎么更改的
xmlspyspring
属性名首字母大写不能忍
×
二十岁以后
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!支付宝:18513450535 ,*益源
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: