Springboot配置详解

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Springboot配置详解

点击上方“后端技术精选”,选择“置顶公众号”

技术文章第一时间送达!

作者:SimpleWu cnblogs.com/SimpleWu/p/10032923.html

阅**(点击即可跳转阅读)**

1. 

**2. **

**3. **

**4. **

**5. **

springboot默认加载配置

SpringBoot使用两种全局的配置文件,全局配置文件可以对一些默认配置进行修改。

  • application.properties
  • application.yml
  • application.yml

    这两个配置文件使我们springboot启动的时候回默认加载的配置文件。

    配置文件放在src/main/resources目录或者类路径/config下,这个配置文件的路径是有优先级的,至于优先级后面再说。

    首先这两个文件中properties这个文件不需要多说使我们经常使用的资源文件,可是这个Yml是什么呢?后面再说

    配置信息

    SpringBoot不需要添加复杂的web.xml或者spring.xml等配置文件,spring只有一个配置文件,也非必须的。

    默认的配置文件是application.properties。

    
    #修改端口号
    server.port=8888
    #定义项目的访问目录
    server.context-path=/springboot
    

    我们使用IDEA需要注意,图就不截图太麻烦了:

    如果properties文件中出现乱码,找到setting中,在file encoding中勾选Transparent native-to-asci conversion。

    YAML文件

    除了默认的properties文件,SpringBoot还提供另外一种配置文件yml,这种文件提供一种更加简洁的方式编写配置信息。

    yml是YAML(YAML Ain‘t Markup Language)语言的文件,是一种标记语言,以数据为中心,比json、xml等更适合做配置文件,有想法的可以去网上搜搜资料学习下。

    参考语法规范:

    官方参考:

    http://www.yaml.org

    yml学习参考:

    https://www.yiibai.com/yaml/yaml_syntax_primitives.html

    YAML基本语法:

  • 以键值对的方式表示属性。(空格必须有)。
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
  • 属性和值是大小写敏感的。
  • 使用缩进表示层级关系

    缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。

    例子:

    
    server:
        port: 8081
        servlet:
            context-path: springboot
    

    注意:【:后必须跟一个空格】,两种方式推荐使用yml方式配置项目。

    YAML语法

    YAML支持的三种数据结构。

  • 字面量:普通的值。(数字,字符串,布尔)
  • 对象:键值对的集合。(Map)
  • 数组:一组按次序排列的值。(List,Set)
  • 对象:键值对的集合。(Map)

    字面量

    YAML中字面量属于普通的值。以key: value来表示,value前必须带一个空格。

    字面量,字符串默认不需要单双引号。

    双引号:会转义字符,特殊字符会被转义。(name: “SimpleWun lisi” //输出:SimpleWu换行 lisi)

    单引号:不会转义字符,特殊字符不会被转义。(name: ‘SimpleWun lisi’ //输出:SimpleWun lisi)

    
    server:
      port: 8081
    

    对象、Map

    在YAML中,对象和Map都是以键值对的方式表示。在下一行来编写属性和值得关系,注意缩进。

    
    users:
      firstName: SimpleWu
      email: lovelyWu98k@gmail.com
    

    对象还有另一种写法,看到这种写法是不是想到了JSON?

    
    users: {
        firstName: zhangsan,
        email: lovelyWu98k@gmail.com
    }
    

    数组

    用-值得方式来表示数组中的一个元素。

    
    users:
        - SimpleWu
        - lovelyWu98k@gmail.com
        - addressisnot
    

    另外一种写法,还是像JSON

    
    users: [SimpleWu,lovelyWu98k@gmail.com,addressisnot]
    

    将配置映射到实体类

    springboot支持我们直接将properties或者yml中的属性映射到某个实体类,看例子。

    
    mysql:
        url: jdbc:mysql:///springboot
        port: 3306
        user: root
        pass: root
    

    假如在资源中我们现在有个mysql的链接信息,我们如何将它映射到实体类中去呢?

    有两种方式:

  • @ConfigurationProperties指定从配置文件中读取属性,prefix指定对应yaml文件中的名称。
  • @Value获取配置的属性值
  • @Value获取配置的属性值

    @ConfigurationProperties

    使用IDEA当我们添加了@ConfigurationProperties注解后,在页面上回出现一个错误提示,我们需要加入依赖。

    
    dependency
        groupIdorg.springframework.boot/groupId
        artifactIdspring-boot-configuration-processor/artifactId
        optionaltrue/optional
    /dependency
    

    编写JAVA类MySQLInfo.java

    
    //java类
    @ConfigurationProperties(prefix = "mysql")
    @Component
    public class MySQLInfo {
        private String url;
        private Integer port;
        private String user;
        private String pass;
        //省略getset
    }
    

    我们只需要指定prefix即可,他就会加载我们yml配置前置为mysql的属性。

    @Value

    如果我们使用这个注解来获取属性使用方式是:

    
    //java类
    @Component
    public class MySQLInfo {
        @Value("${mysql.url}")
        private String url;
        @Value("${mysql.port}")
        private Integer port;
        @Value("${mysql.user}")
        private String user;
        @Value("${mysql.pass}")
        private String pass;
        //省略getset
    }
    

    注意如果需要使用表达式只有@Value才可以,@Value(“#{10*2}) 结果为:20

    两种方式的区别:

    Springboot配置详解

    两种方式的适用场合:

  • 当只需要为某个值提供注入时,推荐使用@Value方式。
  • 当需要对整个对象的整体进行赋值时,使用@ConfigurationProperties。
  • 当需要对整个对象的整体进行赋值时,使用@ConfigurationProperties。

    加载外部配置文件

    如果我们将所有的配置信息都写在application.yml文件中,则到时候yml文件会变得非常庞大,不太方便我们进行维护。

    我们可以对配置中的内容进行拆分,拆分到多个文件中。这样就提高了配置的可维护性。

    引入外部配置文件:

  • @PropertySource(value={"classpath:student.properties"})
  • @ImportResource(locations={"classpath:spring.xml"}
  • @Configuration和@Bean方式。(SpringBoot推荐方式)
  • @ImportResource(locations={“classpath:spring.xml”}

    第一种方式:@ProperSource方式:需要注入的类的前面使用该注解。

    第二种方式:@ImportResource方式首先添加一个spring的配置文件,在里面添加需要映射的类。在启动的SpringBootApplication前面使用该注解

    第三种方式:@Configuration和@Bean方式添加一个自定义配置类。

    
    //第三种方式
    @Configuration
    public class MyConfig {
        //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
        @Bean
        public MySQLInfo mySQLInfo(){
            System.out.println("配置类@Bean给容器中添加组件了...");
            return new MySQLInfo();
        }
    }
    

    切换多个外部配置文件

    真实环境中,有时候需要配置多个配置文件,可以使用spring.profile.active来进行切换。

    比如现在我们有三个配置文件:

  • application.yml
  • application-dev.yml
  • application-prod.yml
  • application-dev.yml

    我们在application.yml中通过spring.profile.active = dev(prod)来选择需要加装的配置文件。

    或者我们可以通过maven将项目打成jar包通过命令行使用以下命令来指定环境

    
    java –jar springboot02-0.0.1-SHAPSHOT.jar –spring.profiles.active=dev
    

    文档块

    在yml文档中,可以适用—来将一个文档拆分为多个文档块。可以在不同文档块中分别定义不同的环境。

    然后通过spring.profiles=xxx来对文档块进行命名。最后通过第一个文档块制定spring.profiles.active=xxx来指定到底激活哪个文档块。

    
    #application.yml
    spring:
       profiles:
          active: dev #指定激活dev文档
    ---
    server:
        port: 8081
    spring:
        profiles: dev #给文档命名为dev
    

    配置文件加载位置和顺序

    springboot启动会扫描一下位置的配置文件作为springboot的默认配置文件。

  • 项目路径下的config文件夹
  • 项目路径下
  • classpath路径下config文件夹
  • classpath路径下
  • 项目路径下

    classpath路径下

    以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,如果冲突的情况,高优先级配置内容会覆盖低优先级配置内容。如果不冲突,形成互补配置。

    我们也可以通过配置spring.config.location来改变默认配置。使用命令行方式加载,否则优先级不够。

    
    java –jar xxxx.jar –spring.config.location=配置文件路径
    

    外部配置加载顺序

    pringBoot也可以从以下位置加载配置;优先级从高到低,高优先级的配置覆盖低优先级的配置,所有配置形成互补配置。

  • 命令行参数
  • 来自java:comp/env的JNDI属性
  • Java系统属性(System.getProperties())
  • 操作系统环境变量
  • RandomValuePropertySource配置的random.*属性值
  • jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  • jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  • jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  • jar包内部的application.properties或application.yml(不带spring.profile)配置文件
  • @Configuration注解类上的@PropertySource
  • 通过SpringApplication.setDefaultProperties指定的默认属性
  • 来自java:comp/env的JNDI属性

    操作系统环境变量

    jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件

    jar包外部的application.properties或application.yml(不带spring.profile)配置文件

    @Configuration注解类上的@PropertySource

    官方参考文档:

    https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-external-config

    springboot自动配置

    SpringBoot启动会加载大量的自动配置类

  • 我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;
  • 我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
  • 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值;
  • 我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)

    自动配置原理:SpringBoot启动的时候,加载主配置类,开启了自动配置功能@EnableAutoConfiguration。利用EnableAutoConfigurationImportSelector给容器中导入一些组件。

    导入的文件在都配置在文件META‐INF/spring.factories中的EnableAutoConfiguration属性来获取的。每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置。

    每一个自动配置类进行自动配置功能;

    根据当前不同的条件判断,决定这个配置类是否生效?

    这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;所有在配置文件中能配置的属性都是在xxxxProperties类中封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类

    技术经验交流:

    看到这里了,就关注一个呗

    Springboot配置详解

    原文始发于微信公众号(后端技术精选):

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> Springboot配置详解


      转载请注明: 好好学java Springboot配置详解

     上一篇
    我赌你不清楚Spring中关于Null的这些事 我赌你不清楚Spring中关于Null的这些事
    点击上方“Java知音”,选择“置顶公众号” 技术文章第一时间送达! 推荐阅**读(点击即可跳转阅读)** 1.  ****2. **** 3.  ****4. **** 之前一直在某些代码中看到过使用@Nullable 标注过的注释,当时
    下一篇 
    Spring和SpringBoot到底有什么区别 Spring和SpringBoot到底有什么区别
    点击上方“Java知音”,选择“置顶公众号” 技术文章第一时间送达! 作者:乐傻驴 www.jianshu.com/p/ffe5ebe17c3a 推荐阅**读(点击即可跳转阅读)** 1.  **2. ** **3. **