springboot properties,springboot读取properties配置文件方式
00-10101、配置文件的格式2、配置文件的加载1-公共配置文件:application.properties2-自定义配置文件:donghao.properties3、配置项的使用3-bind JavaBean:Donghai . Java 4-定义控制器:Donghai controller 5-定义启动入口类:董浩application.javaspringboot免除了大部分手动配置,但是对于一些特定的情况,我们还是需要手动配置。SpringBoot为我们提供了application.properties配置文件,允许我们定制配置来修改默认配置,以适应特定的生产情况,当然也包括一些第三方配置。
几乎所有的配置都可以写入application.peroperties文件,SpringBoot会自动加载,省去了我们手动加载的麻烦。
但其实很多时候我们会自定义配置文件,需要我们手动加载。SpringBoot不会自动识别这些文件。下面我们来仔细看看这些方面。
目录
SpringBoot可以识别两种格式的配置文件,即yml文件和属性文件。我们可以将application.properties文件改为application.yml,这两个文件都可以被SpringBoot自动识别和加载。但如果是自定义配置文件,最好使用properties格式的文件,因为SpringBoot中还没有提供手动加载yml格式文件的功能(这里是注释方法)。
如果要让SpringBoot自动加载application.properties配置文件,需要放在指定的位置:src/main/resource目录下,一般的用户自定义配置文件也放在这个目录下。
00-1010加载意味着将文件读入Spring容器,更具体地说,就是将配置项加载到Spring context容器中,以便随时访问。
SpringBoot项目启动时会自动加载application.properties配置文件,其内部相关设置会自动覆盖SpringBoot的相应默认设置,所以所有配置项都会保存在Spring容器中。
00-1010东豪. name=唯一豪格东豪. sex=男东豪. age=80自定义的xxx.properties配置文件不会被SpringBoot自动加载,需要手动加载。这里的手动加载一般指的是标注的方式。这就涉及到我们今天的一个亮点:加载自定义属性文件的注释:@ property source( class path : XXX . properties )。该注释专门用于在指定位置加载属性文件。Spring还没有提供任何在指定位置加载yml文件的注释,所以有了前面的语句。
00-1010 dong Hao 1 . name=animation dong Hao 1 . sex=female dong Hao 1 . age=22其实无论属性文件在哪里,当我们需要使用配置内容的时候,我们都会在当前类的顶部添加这个注释,并将配置文件加载到内存中。这些配置文件可以一次使用多次。
但是,更一般的情况是创建一个新的配置类,使用@Configuration注释,加上之前的@ property source( class path : XXX . properties )注释,类内部不需要任何东西。这是一个纯配置加载类。
由于@Configuration(底层是@Component)的作用,会被Spring scanner扫描,加载到JVM中,创建Bean,创建时会加载配置文件中的配置项。
以这种方式加载的配置可以在Spring管理的任何类中作为@Value(${key} )使用,如下所述。
00-1010配置项的使用其实很简单。只要加载到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
package com.donghao.model;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;@Configuration@PropertySource("classpath:donghao.properties")@ConfigurationProperties(prefix="donghao1")public class Donghao { private String name; private String sex; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAge() { return age; } public void setAge(String age) { this.age = age; }}
4-定义控制器:DonghaoController
package com.donghao.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.donghao.model.Donghao;@RestController@RequestMapping("/donghao")@EnableConfigurationProperties(Donghao.class)public class DonghaoController { @Autowired Donghao donghao; @Value("${donghao.name}") private String name; @Value("${donghao.sex}") private String sex; @Value("${donghao.age}") private String age; @RequestMapping("/hello") public String hello(){ return "我的名字叫"+name+",我是"+sex+"生,今年"+age+"岁了!"; } @RequestMapping("/ss") public String ss(){ return donghao.getName()+donghao.getSex()+donghao.getAge(); }}
5-定义启动入口类:DonghaoApplication.java
package com.donghao;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class DonghaoApplication { public static void main(String[] args) { SpringApplication.run(DonghaoApplication.class, args); }}
启动程序之后,浏览器访问: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中添加:
huahua=123321
然后在DonghaoController中添加如下代码:
private static String huahua; @Value("${huahua}") public void setHuahua(String huahua){// this.huahua = huahua; DonghaoController.huahua = huahua; } @RequestMapping("/hh") public String hh(){ return "新的测试"+ huahua; }
上面的两种写法均可实现目标。
如此施为,即可实现静态变量的值注入。
浏览器访问:http://localhost:8080/donghao/hh
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。