springboot中免除了大部分手动配置,但是对于一些特定的情况,还是需要我们进行手动配置的,springboot为我们提供了application.properties配置文件,让我们可以进行自定义配置,来对默认的配置进行修改,以适应具体的生产情况,当然还包括一些第三方的配置。几乎所有配置都可以写到application.peroperties文件中,这个文件会被springboot自动加载,免去了我们手动加载的烦恼。但实际上,很多时候我们却会自定义配置文件,这些文件就需要我们进行手动加载,springboot是不会自动识别这些文件的,下面就来仔细看看这些方面的内容。
1、配置文件的格式
springboot可以识别两种格式的配置文件,分别是yml文件与properties文件,我们可以将application.properties文件换成application.yml,这两个文件都可以被springboot自动识别并加载,但是如果是自定义的配置文件,就最好还是使用properties格式的文件,因为springboot中暂时还并未提供手动加载yml格式文件的功能(这里指注解方式)。
application.properties配置文件欲被springboot自动加载,需要放置到指定的位置:src/main/resource目录下,一般自定义的配置文件也位于此目录之下。
2、配置文件的加载
加载的意思就是将文件读取到spring容器之中,更确切的说就是将各个配置项装载到spring上下文容器之中供随时取用。
application.properties配置文件是在springboot项目启动的时候被自动加载的,其内部的相关设置会自动覆盖springboot默认的对应设置项,所以的配置项均会保存到spring容器之中。
1-公共配置文件:application.properties
1 donghao.name=唯一浩哥2 donghao.sex=男3 donghao.age=80
自定义的xxx.properties配置文件是不会被springboot自动加载的,需要手动去进行加载,这里的手动加载一般指的是注解的方式加载,这里就涉及到我们今天的重点之一:加载自定义属性文件的注解:@propertysource(classpath:xxx.properties),这个注解专门用来加载指定位置的properties文件,spring暂未提供加载指定位置yml文件的注解,所以才有之前的说法。
2-自定义配置文件:donghao.properties
1 donghao1.name=动画2 donghao1.sex=女3 donghao1.age=22
其实无论对于哪里的properties文件,当我们需要使用其中配置内容的时候,就在当前类的顶部加注该注解,将该配置文件加载到内存,这些配置文件一次加载即可多次使用。
3、配置项的使用
配置项的使用其实很简单,只要是加载到spring容器中的配置项都可以直接使用@value(${key})的方式来引用,一般将其配置在字段顶部,表示将配置项的值赋值给该字段。
当然更多的情况是将这些配置项与一个javabean绑定起来使用,这样绑定一次,我们就可以随时使用。这里涉及到两种情况,一种是将application.properties中的配置与javabean绑定,一种是将自定义配置文件中的配置与javabean绑定。
第一种:applicaiton.properties属性绑定javabean
这种情况相对简单(因为application.properties文件会被自动加载,也就是说配置项会被自动加载到内存,到spring容器之中,省去了手动加载的配置),然后我们在要与属性绑定的javabean的类定义顶部加@component注解和@configurationproperties(prefix=key)注解,前者的目的是为了这个javabean可以被springboot项目启动时候被扫描到并加载到spring容器之中,重点是后者,这个注解一般不是单独使用的,他一般与后面要说的@enableconfigurationproperties(javabean.class)配合使用,但是二者并非使用在同一位置,@configurationproperties(prefix=key)注解加注在javabean类定义之上,按字面可以理解为属性配置注解,更直接点的说法就是属性绑定注解,官方解释是:如果想要绑定或者验证一些来源自.properties文件中的额外属性时,你可以在一个标注的@configuration的类的注有@bean注解的方法或者一个类之上加注这个注解。我们完全可以将其理解为绑定专用注解。它的作用就是将指定的前缀的配置项的值与javabean的字段绑定,这里要注意,为了绑定的成功,一般将字段的名称与配置项键的最后一个键名相同,这样整个键在去掉前缀的情况下就和字段名称一致,以此来进行绑定。
第二种:自定义配置的属性绑定javabean
这种情况与之前的基本相同,只是不能自动加载,需要手动加载,在javabean之上加上之前介绍的@propertysource注解进行配置文件加载。还有一点就是将@component改为@configuration,为什么这么做呢?
@configuration注解的底层就是@component,但是二者意义不同,@configuration注解侧重配置之意,@component侧重组件之意,当然配置也是项目组件之一,在这里我们要将配置文件属性与javabean绑定,当然更侧重配置之意。
将配置与javabean绑定之后,我们就可以通过javabean来获取配置的内容,而且javabean已经被@component注解或者@configuration注解加载到spring容器,我们可以使用自动注入的方式在其他类中随便使用。
这里要注意一点:当我们在某个类中要使用这个javabean时,需要在这个类中指定这个javabean的类型,这个指定也要使用注解来制定,正是之前介绍的@enableconfigurationproperties注解,这个注解与@configurationproperties注解配套使用。官方给出的解释:这个注解是对@configurationproperties的有效支持。标注有@configurationproperties注解的beans可以被使用标准的方式注册(使用@bean注解),或者,为了方便起见,直接用使用@enableconfigurationproperties指定注册。意思是这个注解提供了一种方便直接的注册bean的方式。
3-绑定javabean:donghao.java
1 package com.donghao.model; 2 3 import org.springframework.boot.context.properties.configurationproperties; 4 import org.springframework.context.annotation.configuration; 5 import org.springframework.context.annotation.propertysource; 6 7 @configuration 8 @propertysource(classpath:donghao.properties) 9 @configurationproperties(prefix=donghao1)10 public class donghao {11 private string name;12 private string sex;13 private string age;14 public string getname() {15 return name;16 }17 public void setname(string name) {18 this.name = name;19 }20 public string getsex() {21 return sex;22 }23 public void setsex(string sex) {24 this.sex = sex;25 }26 public string getage() {27 return age;28 }29 public void setage(string age) {30 this.age = age;31 }32 }
4-定义控制器:donghaocontroller
1 package com.donghao.controller; 2 3 import org.springframework.beans.factory.annotation.autowired; 4 import org.springframework.beans.factory.annotation.value; 5 import org.springframework.boot.context.properties.enableconfigurationproperties; 6 import org.springframework.web.bind.annotation.requestmapping; 7 import org.springframework.web.bind.annotation.restcontroller; 8 9 import com.donghao.model.donghao;10 11 @restcontroller12 @requestmapping(/donghao)13 @enableconfigurationproperties(donghao.class)14 public class donghaocontroller {15 16 @autowired17 donghao donghao;18 19 @value(${donghao.name})20 private string name;21 22 @value(${donghao.sex})23 private string sex;24 25 @value(${donghao.age})26 private string age;27 28 29 @requestmapping(/hello)30 public string hello(){31 return 我的名字叫+name+,我是+sex+生,今年+age+岁了!;32 }33 34 @requestmapping(/ss)35 public string ss(){36 return donghao.getname()+donghao.getsex()+donghao.getage();37 }38 }
5-定义启动入口类:donghaoapplication.java
1 package com.donghao; 2 3 import org.springframework.boot.springapplication; 4 import org.springframework.boot.autoconfigure.springbootapplication; 5 6 @springbootapplication 7 public class donghaoapplication { 8 9 public static void main(string[] args) {10 11 springapplication.run(donghaoapplication.class, args);12 13 }14 15 }
启动程序之后,浏览器访问:http://localhost:8080/donghao/hello,结果为:
浏览器访问:http://localhost:8080/donghao/ss
我这里要重点强调一点,加载和使用并不相关联,虽然加载的目的是为了使用,但是加载和使用之间并不是强关联的,我们完全可以加载但不实用,所以我们应该将加载的过程与使用的过程分开来分析,他们对应于不同的注解,这些注解之间并不是强关联的,他们各有各的用途,各有作用,如果只是加载自定义配置文件,只要一个@propertysource注解就完事,使用方面的注解不用去管,当需要使用的使用,我们完全可以选择多种使用的方式,直接使用的话我们就使用@value注解进行直接赋值,这个注解就可以直接将被加载到spring容器中的属性配置的值赋值到指定的字段,当然也可以使用绑定javabean的方式。
还有一点要注意,千万不要在公共配置文件application.properties和自定义配置文件xxx.properties中配置相同的的配置项的不同值,因为公共配置文件的优先权最高,会覆盖掉自定义配置文件中的内容,你可以这么理解,公共配置文件中的某个配置被在启动时加载到spring容器中,之后又在另外一个自定义配置文件中加载了同名的配置项,二者有不同的值,但是系统会检查二者的优先权,谁高谁留,谁低谁走,最后自定义配置文件中的值无效。
以上就是properties配置的详细介绍的详细内容。