SpringBoot 笔记 ( 二 ):自定义配置

SpringBoot 笔记 ( 二 )

1. 配置文件

SpringBoot使用一个全局的配置文件,配置文件名是固定的:

  • application.properties
  • application.yml

   修改SpringBoot自动配置的默认值,因为在所有的自动配置类中他们都会去读取我们的配置文件,如果说有配置这些项目就按照我们配置的,没有则使用自动配置。    支持两种格式,我们主要说说后面一种,前面比较简单就是采用的点的方式定义的。yml 其实也是一种标记语言,YAML 他的语法比较简洁,写起来没有 xml 那么臃肿。

2. YAML 语法

1、基本语法

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

空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的同时属性和值也是大小写敏感;

2. 字面量:普通的值(数字,字符串,布尔)

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

3. 对象、Map(属性和值)(键值对):

​ k: v:在下一行来写对象的属性和值的关系;注意缩进

​ 对象还是k: v的方式

friends: lastName: zhangsan age: 20

行内写法:

friends: {lastName: zhangsan,age: 18}

4. 数组、表(List、Set):

用- 值表示数组中的一个元素

pets: - cat - dog - pig

行内写法

pets: [cat,dog,pig]

3. 配置文件注入

配置文件

person: lastName: hello age: 18 boss: false birth: 2017/12/12 maps: {k1: v1,k2: 12} lists: - lisi - zhaoliu dog: name: 小狗 age: 12

Bean:

/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定; * prefix = "person":配置文件中哪个下面的所有属性进行一一映射 * * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能; * */@Component@ConfigurationProperties(prefix = "person")public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog;

在导入配置文件处理器以后,编写配置就有提示了。

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

一个小问题就是配置文件中配置的中文读出来会乱码,这主要是 idea 的 properties 文件默认采用的 utf-8 ,我们需要使用自动转 ascii 码。

4. 配置类

SpringBoot推荐给容器中添加组件的方式,推荐使用全注解的方式

  1. 配置类 @Configuration 等价于 Spring 配置文件
  2. 使用 @Bean 给容器中添加组件

/** * @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件 * * 在配置文件中用<bean><bean/>标签添加组件 * */@Configurationpublic class MyAppConfig { //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名,也可以自己指定。 @Bean public HelloService helloService02(){ System.out.println("配置类@Bean给容器中添加组件了..."); return new HelloService(); }}

5. 多环境配置文件

1. 多Profile文件

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

2. yml支持多文档块方式

server: port: 8081spring: profiles: active: prod---server: port: 8083spring: profiles: dev---server: port: 8084spring: profiles: prod #指定属于哪个环境

3. 激活指定profile

  1. 在配置文件中指定 spring.profiles.active=dev
  2. 命令行:java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;可以直接在测试的时候,配置传入命令行参数
  3. 虚拟机参数; ​ -Dspring.profiles.active=dev

4. 指定外部配置文件

所有的配置都可以在命令行上进行指定 java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc

6. 自动配置原理

  1. SpringBoot启动的时候加载主配置类,开启了自动配置功能 ==@EnableAutoConfiguration==
  2. @EnableAutoConfiguration 作用:
  • EnableAutoConfigurationImportSelector给容器中导入一些组件
  • selectImports()方法中的 List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); 获取候选的配置
  • SpringFactoriesLoader.loadFactoryNames()扫描所有jar包类路径下 META-INF/spring.factories 把扫描到的这些文件的内容包装成 properties 对象,从 properties 中获取到 EnableAutoConfiguration.class 类(类名)对应的值,然后把他们添加在容器中

总之一句话将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中 如下:

# Auto Configureorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\

每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置

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

//表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件@Configuration //启动指定类的ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把HttpEncodingProperties加入到ioc容器中@EnableConfigurationProperties(HttpEncodingProperties.class) //Spring底层@Conditional注解,根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效,判断当前应用是否是web应用,如果是,当前配置类生效@ConditionalOnWebApplication //判断当前项目有没有这个类CharacterEncodingFilter,SpringMVC中进行乱码解决的过滤器;@ConditionalOnClass(CharacterEncodingFilter.class) //判断配置文件中是否存在某个配置 spring.http.encoding.enabled;如果不存在,判断也是成立的,也就是说即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true) public class HttpEncodingAutoConfiguration { //他已经和SpringBoot的配置文件映射了 private final HttpEncodingProperties properties; //只有一个有参构造器的情况下,参数的值就会从容器中拿 public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) { this.properties = properties; } @Bean //给容器中添加一个组件,这个组件的某些值需要从properties中获取 @ConditionalOnMissingBean(CharacterEncodingFilter.class) //判断容器没有这个组件? public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE)); return filter; }

   根据当前不同的条件判断,决定这个配置类是否生效,一但这个配置类生效,这个配置类就会给容器中添加各种组件,这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的。    也就是如下两个类非常重要:

  • xxxxAutoConfigurartion:自动配置类。
  • xxxxProperties: 封装配置文件中相关属性。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

日志那点事儿——slf4j源码剖析

前言: 说到日志,大多人都没空去研究,顶多知道用logger.info或者warn打打消息。那么commons-logging,slf4j,logback...

2685
来自专栏Star先生的专栏

从源码中分析 Hadoop 的 RPC 机制

RPC是Remote Procedure Call(远程过程调用)的简称,这一机制都要面对两个问题:对象调用方式余与序列/反序列化机制。本文给大家介绍从源码中分...

7320
来自专栏开发技术

spring-boot-2.0.3不一样系列之源码篇 - run方法(二)之prepareEnvironment,绝对有值得你看的地方

  此系列是针对springboot的启动,旨在于和大家一起来看看springboot启动的过程中到底做了一些什么事。如果大家对springboot的源码有所研...

2653
来自专栏carven

gulp尝试开发

这是挺久之前的事情了,还是觉得先记录下来,免得自己忘记了。 在实习的公司做web开发,gulp 是经常用到的,可是我做的不仅仅的前端,还包括后台, 所以将前端文...

1220
来自专栏代码世界

AJAX

先了解JSON 什么是JSON? JSON 指的是JavaScript对象表示法(JavaScript Object Notation) JSON 是轻量级的文...

4447
来自专栏技术最杂谈

Fiddler应用之FiddlerScript

Fiddler是一款强大的HTTP抓包工具,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddle...

8436
来自专栏大内老A

了解ASP.NET MVC几种ActionResult的本质:FileResult

FileResult是一个基于文件的ActionResult,利用FileResult我们可以很容易地将从某个物理文件的内容响应给客户端。ASP.NET MVC...

20910
来自专栏分布式系统进阶

ReplicaManager源码解析1-消息同步线程管理

基本上就是作三件事: 构造FetchRequest, 同步发送FetchRequest并接收FetchResponse, 处理FetchResponse, 这三...

1632
来自专栏你不就像风一样

史上超详细的Spring-Boot-Cache使用与整合

Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheMa...

6872
来自专栏向治洪

JSBridge深度剖析

概述 做过混合开发的人都知道Ionic和PhoneGap之类的框架,这些框架在web基础上包装一层Native,然后通过Bridge技术的js调用本地的库。 在...

3445

扫码关注云+社区

领取腾讯云代金券