springBoot--properties配置

来源:互联网 发布:h3c路由器端口ip设置 编辑:程序博客网 时间:2024/05/17 04:42

https://www.cnblogs.com/V1haoge/p/7183408.html

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

donghao.name=唯一浩哥donghao.sex=男donghao.age=80
自定义的xxx.properties配置文件是不会被SpringBoot自动加载的,需要手动去进行加载,这里的手动加载一般指的是注解的方式加载,这里就涉及到我们今天的重点之一:加载自定义属性文件的注解:@PropertySource("classpath:xxx.properties"),这个注解专门用来加载指定位置的properties文件,Spring暂未提供加载指定位置yml文件的注解,所以才有之前的说法。

 donghao1.name=动画 donghao1.sex=女 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

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,结果为:

加载和使用并不相关联,虽然加载的目的是为了使用,但是加载和使用之间并不是强关联的,我们完全可以加载但不实用,所以我们应该将加载的过程与使用的过程分开来分析,他们对应于不同的注解,这些注解之间并不是强关联的,他们各有各的用途,各有作用,如果只是加载自定义配置文件,只要一个@PropertySource注解就完事,使用方面的注解不用去管,当需要使用的使用,我们完全可以选择多种使用的方式,直接使用的话我们就使用@Value注解进行直接赋值,这个注解就可以直接将被加载到Spring容器中的属性配置的值赋值到指定的字段,当然也可以使用绑定JavaBean的方式。

  还有一点要注意,千万不要在公共配置文件application.properties和自定义配置文件xxx.properties中配置相同的的配置项的不同值,因为公共配置文件的优先权最高,会覆盖掉自定义配置文件中的内容,你可以这么理解,公共配置文件中的某个配置被在启动时加载到Spring容器中,之后又在另外一个自定义配置文件中加载了同名的配置项,二者有不同的值,但是系统会检查二者的优先权,谁高谁留,谁低谁走,最后自定义配置文件中的值无效


使用spring.profiles.active来分区配置  http://www.leftso.com/blog/111.html

spring boot允许你通过命名约定按照一定的格式(application-{profile}.properties)来定义多个配置文件,然后通过在application.properyies通过spring.profiles.active来具体激活一个或者多个配置文件,如果没有没有指定任何profile的配置文件的话,spring boot默认会启动application-default.properties。

profile的配置文件可以按照application.properyies的放置位置一样,放于以下四个位置,

  1. 当前目录的 “/config”的子目录下
  2. 当前目录下
  3. classpath根目录的“/config”包下
  4. classpath的根目录下

我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。
    对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单。
       在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:
   application-dev.properties:开发环境
   application-test.properties:测试环境
   application-prod.properties:生产环境
       至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。
如:spring.profiles.active=test就会加载application-test.properties配置文件内容
下面,以不同环境配置不同的服务端口为例,进行样例实验。
 
     针对各环境新建不同的配置文件application-dev.propertiesapplication-test.propertiesapplication-prod.properties
     在这三个文件均都设置不同的server.port属性,如:dev环境设置为8080,test环境设置为9090,prod环境设置为80
     application.properties中设置spring.profiles.active=dev,就是说默认以dev环境设置
 
测试不同配置的加载:
     执行java -jar xxx.jar,可以观察到服务端口被设置为8080,也就是默认的开发环境(dev)
 
     执行java -jar xxx.jar --spring.profiles.active=test,可以观察到服务端口被设置为9090,也就是测试环境的配置(test)
 
     执行java -jar xxx.jar --spring.profiles.active=prod,可以观察到服务端口被设置为80,也就是生产环境的配置(prod)
 
按照上面的实验,可以如下总结多环境的配置思路:
   application.properties中配置通用内容,并设置spring.profiles.active=dev,以开发环境为默认配置
   application-{profile}.properties中配置各个环境不同的内容
通过命令行方式去激活不同环境的配置。

多环境高级应用
       在某些情况下,应用的某些业务逻辑可能需要有不同的实现。例如邮件服务,假设EmailService中包含的send(String email)方法向指定地址发送电子邮件,但是我们仅仅希望在生产环境中才执行真正发送邮件的代码,而开发环境里则不发送以免向用户发送无意义的垃圾邮件。
       我们可以借助Spring的注解@Profile实现这样的功能,这样需要定义两个实现EmailService借口的类:

/** * 发送邮件接口. */public interface EmailService {    /**发送邮件*/    publicvoid send();}发送邮件的具体实现(dev-开发环境的代码):@Service@Profile("dev") //开发环境的时候.public class DevEmailServiceImpl implements EmailService{     @Override    publicvoid send() {       System.out.println("DevEmailServiceImpl.send().开发环境不执行邮件的发送.");    }}
发送邮件的具体实现(prod-生产环境的代码):
@Service@Profile("prod") //生产环境.public class ProdEmailServiceImpl2 implements EmailService{       @Override    publicvoid send() {       System.out.println("DevEmailServiceImpl.send().生产环境执行邮件的发送.");       //具体的邮件发送代码.       //mail.send();    }}
@Profile("dev")表明只有Spring定义的Profile为dev时才会实例化DevEmailService这个类。

原创粉丝点击