扫码关注公众号:芋道源码

发送: 百事可乐
获取永久解锁本站全部文章的链接

《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 https://www.cnblogs.com/SimpleWu/p/10032923.html 「SimpleWu」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

springboot默认加载配置

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

  • application.properties
  • application.yml

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

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

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

配置信息

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

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

Copy#修改端口号
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键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
  • 属性和值是大小写敏感的。

例子:

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

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

YAML语法

YAML支持的三种数据结构。

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

字面量

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

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

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

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

Copyserver:
port: 8081

对象、Map

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

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

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

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

数组

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

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

另外一种写法,还是像JSON

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

将配置映射到实体类

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

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

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

有两种方式:

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

@ConfigurationProperties

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

Copy<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

编写JAVA类MySQLInfo.java

Copy//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

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

Copy//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

两种方式的区别:

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定 支持 属性名必须完全匹配
SPEL表达式 不支持 支持
JSR303效验 支持 不支持
复杂类型 支持 不支持

两种方式的适用场合:

当只需要为某个值提供注入时,推荐使用@Value方式。

当需要对整个对象的整体进行赋值时,使用@ConfigurationProperties。

加载外部配置文件

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

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

引入外部配置文件:

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

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

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

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

Copy//第三种方式
@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.yml中通过spring.profile.active = dev(prod)来选择需要加装的配置文件。

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

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

文档块

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

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

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

配置文件加载位置和顺序

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

  1. 项目路径下的config文件夹
  2. 项目路径下
  3. classpath路径下config文件夹
  4. classpath路径下

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

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

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

外部配置加载顺序

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

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

官方参考文档: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类中封装者‘;配置文件能配置什么就可以参照某个功能对应的这个属性类

文章目录
  1. 1. springboot默认加载配置
  2. 2. 配置信息
  3. 3. 将配置映射到实体类
  4. 4. 加载外部配置文件
  5. 5. springboot自动配置