原创做品,能够转载,可是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7183408.htmlhtml
SpringBoot中免除了大部分手动配置,可是对于一些特定的状况,仍是须要咱们进行手动配置的,SpringBoot为咱们提供了application.properties配置文件,让咱们能够进行自定义配置,来对默认的配置进行修改,以适应具体的生产状况,固然还包括一些第三方的配置。几乎全部配置均可以写到application.peroperties文件中,这个文件会被SpringBoot自动加载,免去了咱们手动加载的烦恼。但实际上,不少时候咱们却会自定义配置文件,这些文件就须要咱们进行手动加载,SpringBoot是不会自动识别这些文件的,下面就来仔细看看这些方面的内容。java
一、配置文件的格式web
SpringBoot能够识别两种格式的配置文件,分别是yml文件与properties文件,咱们能够将application.properties文件换成application.yml,这两个文件均可以被SpringBoot自动识别并加载,可是若是是自定义的配置文件,就最好仍是使用properties格式的文件,由于SpringBoot中暂时还并未提供手动加载yml格式文件的功能(这里指注解方式)。spring
application.properties配置文件欲被SpringBoot自动加载,须要放置到指定的位置:src/main/resource目录下,通常自定义的配置文件也位于此目录之下。浏览器
二、配置文件的加载app
加载的意思就是将文件读取到Spring容器之中,更确切的说就是将各个配置项装载到Spring上下文容器之中供随时取用。测试
application.properties配置文件是在SpringBoot项目启动的时候被自动加载的,其内部的相关设置会自动覆盖SpringBoot默认的对应设置项,因此的配置项均会保存到Spring容器之中。动画
1-公共配置文件:application.propertiesthis
1 donghao.name=惟一浩哥 2 donghao.sex=男 3 donghao.age=80
自定义的xxx.properties配置文件是不会被SpringBoot自动加载的,须要手动去进行加载,这里的手动加载通常指的是注解的方式加载,这里就涉及到咱们今天的重点之一:加载自定义属性文件的注解:@PropertySource("classpath:xxx.properties"),这个注解专门用来加载指定位置的properties文件,Spring暂未提供加载指定位置yml文件的注解,因此才有以前的说法。spa
2-自定义配置文件:donghao.properties
1 donghao1.name=动画 2 donghao1.sex=女 3 donghao1.age=22
其实不管对于哪里的properties文件,当咱们须要使用其中配置内容的时候,就在当前类的顶部加注该注解,将该配置文件加载到内存,这些配置文件一次加载便可屡次使用。但更通用的状况是新建一个配置类,使用@Configuration标注,再加上以前的@PropertySource("classpath:xxx.properties")注解,而类的内部并不须要任何内容,这是一个纯粹的配置加载类。因为@Configuration的做用(底层为@Component),他会被Spring的扫描器扫到,并加载到JVM,并建立Bean,而建立的时候就会执行配置文件中配置项的加载。这种方式加载的配置能够在任何Spring管辖的类中用@Value("${key}")的方式使用,见下方介绍。
三、配置项的使用
配置项的使用其实很简单,只要是加载到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 @RestController 12 @RequestMapping("/donghao") 13 @EnableConfigurationProperties(Donghao.class) 14 public class DonghaoController { 15 16 @Autowired 17 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容器中(environment)的属性配置的值赋值到指定的字段,固然也可使用绑定JavaBean的方式。
还有一点要注意,千万不要在公共配置文件application.properties和自定义配置文件xxx.properties中配置相同的的配置项的不一样值,由于公共配置文件的优先权最高,会覆盖掉自定义配置文件中的内容,你能够这么理解,公共配置文件中的某个配置被在启动时加载到Spring容器中,以后又在另一个自定义配置文件中加载了同名的配置项,两者有不一样的值,可是系统会检查两者的优先权,谁高谁留,谁低谁走,最后自定义配置文件中的值无效。
补充:感谢朋友Vtria丶提出的问题,这里添加一点补充内容
有些时候咱们须要定义一些静态的字段(变量),也想使用这种方式实现值的注入,可是发现注入不进去,缘由何在呢?这须要对值注入的原理有些了解,值的注入和属性的注入相似,都是基于set方法实现的,那么就简单了,咱们只要针对静态变量添加set方法便可,可是添加以后发现仍是很差使,由于咱们还须要将Value注解转移到set方法上来,这样就能够实现注入了。set方法的写法能够与普通变量的写法相同,用this调用,也能够直接类名点用。
好比:咱们在applicaiton.properties中添加:
1 huahua=123321
而后在DonghaoController中添加以下代码:
1 private static String huahua; 2 3 @Value("${huahua}") 4 public void setHuahua(String huahua){ 5 // this.huahua = huahua; 6 DonghaoController.huahua = huahua; 7 } 8 9 @RequestMapping("/hh") 10 public String hh(){ 11 return "新的测试"+ huahua; 12 }
上面的两种写法都可实现目标。
如此施为,便可实现静态变量的值注入。
浏览器访问:http://localhost:8080/donghao/hh