zoukankan      html  css  js  c++  java
  • springBoot基础系列--properties配置

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7183408.html

      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文件,当我们需要使用其中配置内容的时候,就在当前类的顶部加注该注解,将该配置文件加载到内存,这些配置文件一次加载即可多次使用。但更通用的情况是新建一个配置类,使用@Configuration标注,再加上之前的@PropertySource("classpath:xxx.properties")注解,而类的内部并不需要任何内容,这是一个纯粹的配置加载类。由于@Configuration的作用(底层为@Component),他会被Spring的扫描器扫到,并加载到JVM,并创建Bean,而创建的时候就会执行配置文件中配置项的加载。这种方式加载的配置可以在任何Spring管辖的类中用@Value("${key}")的方式使用,见下方介绍。

    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 @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

  • 相关阅读:
    Mysql体系结构(第4天)
    常用的课程网站
    Mysql 升级、用户与授权,
    Bootstrap
    项目中用到的一些特殊字符和图标 Content:"2715",特殊字符和图标
    CentOS 7 安装与卸载MySQL
    Iterm2使用
    Linux定时任务
    Ext.create细节分析
    Ext.define细节分析
  • 原文地址:https://www.cnblogs.com/V1haoge/p/7183408.html
Copyright © 2011-2022 走看看