Spring Boot(二)——配置文件

目录

 

一、配置文件

1.1springBoot使用一个全局的配置文件

1.2.yml 标记语言

1.3可以对一些参数进行修改

1.3.1使用.properties文件配置:

1.3.2使用.yml配置

二、YAML语法

2.1基本语法

2.2值的写法

2.2.1字面量:普通的值(数字、字符串、布尔);

2.2.2对象、Map

2.2.3数组(List、Set)

三、使用

3.1建立Person类和Dog类

3.2在yml中赋值:

3.3映射

3.4例子(使用@ConfigurationProperties赋值)

3.4.1使用YML配置文件

3.4.2使用Properties配置文件

3.5例子(使用@Value赋值)

总结:@Value和@ConfigurationProperties区别:

四、@PropertySource

五、@ImportResource(不推荐)

5.1SpringBoot推荐给容器中添加组件的方式

六、配置文件占位符

随机数、获取之前配置的值

七、Profile文件

7.1.多个Profile文件

    7.1.1编写多个配置文件

     7.1.2使用yml

7.2激活指定profile

    7.2.1配置文件           

    7.2.2命令行

    7.2.3jvm参数

八、配置文件加载位置

九、自动配置原理

9.3.以HttpEncodingAutoConfiguration为例解释自动配置原理:

9.4debug报告


一、配置文件

1.1springBoot使用一个全局的配置文件

配置文件名是固定的,(src/main/resources目录下)

-application.properties

-application.yml

1.2.yml 标记语言

YAML(YAML Ain't Markup Language)语言的文件,以数据为中心,比json、xml等更适合做配置文件

1.3可以对一些参数进行修改

如,端口号:server.port = 8081,例子如下:

1.3.1使用.properties文件配置:

1.3.2使用.yml配置

二、YAML语法

2.1基本语法

k空格V:表示一对键值对(空格必须有);

以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一个层级的;

属性和值大小写敏感;

2.2值的写法

2.2.1字面量:普通的值(数字、字符串、布尔);

  k:v:字面量直接来写,字符串默认不用加上单引号或者双引号;

“”:双引号。name:“tchuhu \n haha”; 输出:  tchuhu 换行 haha

'':单引号。name:'tchuhu \n haha'; 输出:  tchuhu \n haha

2.2.2对象、Map

或者,行内写法:

2.2.3数组(List、Set)

行内写法:

三、使用

3.1建立Person类和Dog类

3.2在yml中赋值:

3.3映射

警告:(配置文件中会自动提示...)

解决方法:导入依赖

<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

3.4例子(使用@ConfigurationProperties赋值)

3.4.1使用YML配置文件

3.4.2使用Properties配置文件

可能会乱码,修改Setting文件:

(idea默认为UTF-8,因此呢,配置文件需要将UTF-8转换为ASCII码,只需要打钩即可)

3.5例子(使用@Value赋值)

总结:@Value和@ConfigurationProperties区别:

  @ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个一个指定
松散绑定(松散语法) 支持,即:配置文件中N或-n 不支持
SpEL 不支持 支持,即:#{11*2}
JSR303数据校验 支持,如:@Validated+@Email 不支持
复杂类型,如map,list 支持 不支持

1.配置文件yml还是properties都能获取到值;

2.如果在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

3.如果编写了一个javaBean来和配置文件进行映射,那么就用@ConfigurationProperties

四、@PropertySource

加载指定的配置文件:

五、@ImportResource(不推荐)

导入自己编写的Spring配置文件,让配置文件里面的内容生效;

    

5.1SpringBoot推荐给容器中添加组件的方式

写一个配置类,使用@Bean

六、配置文件占位符

随机数、获取之前配置的值

七、Profile文件

7.1.多个Profile文件

    7.1.1编写多个配置文件

      文件名可以是: application-{profile}.properties/yml

     7.1.2使用yml

      使用问文档块

7.2激活指定profile

    7.2.1配置文件           

       spring.profiles.active=prod

      

    7.2.2命令行

      --spring.profiles.active = dev

    7.2.3jvm参数

     -Dspring.profiles.active = dex

八、配置文件加载位置

springBoot启动会扫描一下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件

- file(项目):/config/

- file(项目):/

- classpath(resources): /config/

- classpath(resources):/

以上按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置的内容。

可以通过spring.config.location来改变默认配置:互补配置

九、自动配置原理

9.1.SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration

9.2.@EnableAutoConfiguration作用:

  -利用 AutoConfigurationImportSelector给容器中导入一些组件;

  -List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置

   --SpringFactoriesLoader.loadFactoryNames()

      --扫描所有的jar包类路径下    META-INF/spring.factories

      --把扫描到的这些文件的内容封装成properties对象

      --从properties中获取到EnableAutoConfiguration.class类对应的值,然后把他们添加到容器中

  将 类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到容器中

9.3.以HttpEncodingAutoConfiguration为例解释自动配置原理:

@Configuration
//表示这是一个配置类
@EnableConfigurationProperties({HttpProperties.class})
//启动指定类的ConfigurationProperties功能,将配置文件中对应的值和HttpProperties绑定起来
//并把HttpProperties加入到容器中
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
//Spring底层的@Controller注解,根据不同条件。
//如果满足条件呢,整个配置类里面的配置就会生效;
//判断当前应用是否是web应用,如果是,当前配置生效
@ConditionalOnClass({CharacterEncodingFilter.class})
//判断当前项目有没有这个类
//CharacterEncodingFilter:springmvc中进行乱码解决的过滤器
@ConditionalOnProperty(
    prefix = "spring.http.encoding",
    value = {"enabled"},
    matchIfMissing = true
)
//判断配置文件中是否存在某个配置 
public class HttpEncodingAutoConfiguration {
-----@Conditional扩展注解------ ------作用(判断是否满足当前指定条件)----
@ConditionalOnJava 系统点的java版本是否符合要求
@ConditionalOnBean 容器中存在指定Bean
@ConditionalOnMissingBean 容器中不存在指定Bean
@ConditionalOnExpression 满足SpEl表达式指定
@ConditionalOnClass 系统中有指定的类
@ConditionalOnMissingClass 系统中没有指定的类
@ConditionalOnSingleCandidate 容器中只有一个指定的Bean
@ConditionalOnProperty 系统中指定的属性是否有指定的值
@ConditionalOnResource 类路径下是否存在指定的资源文件
@ConditionalOnWebApplication 当前是web环境
@ConditionalOnNotWebApplication 当前不是web环境
@ConditionalOnJndi JNDI存在指定项

9.4debug报告

配置:

哪些类已经自动配置

哪些类没有自动配置?

发布了25 篇原创文章 · 获赞 5 · 访问量 4504

猜你喜欢

转载自blog.csdn.net/qq_41605068/article/details/104045481