Spring Boot笔记 -- 配置

打包运行
    使用插件:spring-boot-maven-plugin打成jar包,直接执行jar就可以运行
POM文件
    父项目依赖:spring-boot-starter-parent -> spring-boot-dependencies
    spring boot的版本仲裁:以后我们导入依赖默认是不需要写版本的;没有在dependencies里面管理的依赖自然需要声明版本号
    spring-boot-starter-web:
        sping boot starter: spring boot的场景启动器,帮我们导入web的依赖
        spring boot将所有的功能场景都抽离出来,做成一个个的starters(启动器),只需要在项目里面引入依赖

resources文件夹中的目录结构
    static:保存所有的静态资源,js,css,img
    templates:保存所有的模版页面(spring boot默认jar包使用嵌入式的tomcat,默认不支持JSP页面)可以使用模版引擎(freemarker, thymeleaf)
    application.properties: Spring boot应用的配置文件,可以修改一些默认的配置项
        比如配置 'server.port=8081' 来改变端口号

配置文件
    配置文件名是固定的
    application.properties
    application.yml
    YAML文件以数据为中心的标记语言
    YAML语法:
        k:(空格)v 表示一对键值对
        以空格的缩进来控制层级 关系,属性的值大小写敏感
        值的写法:
            字面量:普通的值(数字,字符串,布尔)
                字符串默认不需要加引号;
                    如果加双引号不会转译特殊字符:"\n" -> 换行
                    如果加单引号会转译特殊字符:'\n' -> '\n'
            对象以Map的形式表示
                缩进写法:
                    user:
                        name: 'dog'
                        age: 13
                行内写法:user: {name: 'dog', age: 13}
            数组(List. Set)
                缩进写法:
                    list:
                        - 1
                        - 2
                        - 3
                行内写法:list: [1, 2, 3]


@ConfigurationProperties     和     @value("") 的区别
    批量注入配置文件中的属性            一个个的指定
    支持松散绑定                      不支持松散绑定
    不支持spEL                       支持spEL
    支持JSR303数据校验(@Validated)    不支持
    支持                             不支持复杂类型封装(比如map,list)

    如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
    如果说,我们专门编写一个javaBean来配置文件进行映射,我们就使用@ConfigurationProperties

@ConfigurationProperties : 默认从全局配置文件中获取值
@PropertySource 和  @ImportResource
    @PropertySource : 加载指定的配置文件
    @ImportResource : 导入Spring 的配置文件,让配置文件里面的内容生效



springBoot推荐给容器添加组件的方式,推荐使用全注解的方式
    1. 配置类  ======  spring配置文件
    2. 使用@Bean给容器中添加组件



配置文件的占位符
    1. 随机数 ${random.value} ${random.uuid} ${random.long}
    2. 占位符并可以指定默认值 ${person.name:zhangsan}




Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境。

    多Profile文件
        我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
        默认使用application.properties的配置

        激活指定profile
        在配置文件中指定 spring.profiles.active=dev

    yml支持多文档块的方式

    命令行个参数

    虚拟机参数
    -Dspring.profiles.active=dev


配置文件的加载位置
    Spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为spring boot的默认配置文件
    file: ./config/
    file: ./
    classpath: /config/
    classpath: /
    以上是按照优先级从高优先级到低优先级, 每个配置文件中的属性有互补配置

    我们可以通过spring.config.location来改变默认的配置文件位置
    项目打包好以后 我们可以使用命令行参数的形式,启动项目的时候指定配置文件的新位置


外部配置加载顺序
    命令行参数
    jar包外包的application-{profile}.propertes的配置文件

自动配置原理:
    1. spring boot启动的时候加载主配置类,开启类自动配置功能@EnableAutoConfiguration
    2. @EnableAutoConfiguration的作用
        EnableAutoConfigurationImportSelector 利用这个选择器给容器导入一些组件
        可以查看selectImports方法的内容
        List<String> configurations = getCandidateConfigrations(annotationMetadata, attributes)获取候选的配置

        SpringFactoriesLoader.loadFactoryNames) 扫描jar包类路径下 META_INF/Spring.factories
        把扫描到的这些文件的内容封装成properties对象
        从properties中获取到EnableAutoConfiguration.class类对应的值,然后把他们添加到容器中
        将类路径下 META/INF/spring.factories里面配置的所有的EnableAutoConfiguration值加入到了容器中
        每一个这样的xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置
        每一个自动配置类进行自动配置功能
        以 HttpEncodingAutoConfiguration为例解释自动配置原理:
            @Configuration // 表示这是一个配置类,以前编写的配置文件一样,也可以给容器添加组件
            @EnableConfigurationProperties(HttpEncodingProperties.class)
            @ConditionalOnWebApplication
            @ConditionalOnClass(CharacterEncodingFilter.class)
            @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
            public class HttpEncodingAutoConfiguration {
        根据当前不同的条件判断,决定配置是否生效,如果生效就@Bean 给容器中添加一个组件
        一旦配置生效,这个配置类就给容器中添加各种组件

    3. 精髓
        1)spring boot启动会加载大量的自动配置类
        2)我们看我们需要的功能有没有spring boot默认写好的自动配置类
        3)我们在来看这个自动配置类中到底配置了哪些组件,只要我们要用的组件有 我们就不需要在配置了
        4)给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值

    4. @Conditional派生注解
        作用: 必须是@Conditional指定的添加成立,才给容器中添加组件,配置文件中的属性才生效
            @ConditionalOnBean // 判断容器中是否存在组件
             @ConditionalJava // 系统的java版本是否符合要求
             @ConditionalOnProperty
             @ConditionalOnResource
             @ConditionalOnWebAppliaction
    5. 我们怎么知道哪些配置类生效了
        在配置文件中配置debug=true

猜你喜欢

转载自blog.csdn.net/txgANG/article/details/106479588