超全、超详的Spring
来源:    发布时间:2019-10-03    

springboot默认加载配置

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

这两个配置文件使我们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语言的文件,是一种标记语言,以数据为中心,比json、xml等更适合做配置文件,有想法的可以去网上搜搜资料学习下。

参考语法规范:

官方参考: http://www.yaml.org

yml学习参考:https://www.yiibai.com/yaml/yaml_syntax_primitives.html

YAML基本语法:

例子:

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




注意:,两种方式推荐使用yml方式配置项目。

YAML语法

YAML支持的三种数据结构。

字面量

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

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

双引号:会转义字符,特殊字符会被转义。

单引号:不会转义字符,特殊字符不会被转义。

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

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


org.springframework.boot
spring-boot-configuration-processor
true






编写JAVA类MySQLInfo.java

//java类
@ConfigurationProperties
@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
private String url;
@Value
private Integer port;
@Value
private String user;
@Value
private String pass;
//省略getset
}


















切换多个外部配置文件

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

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

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

或者我们可以通过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的默认配置文件。

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

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

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


外部配置加载顺序

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

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


相关:

央视报道:游戏业凛冬已至 近五成上市公司利润下滑过去半年持续对国内游戏业带着批评态度报道的央视,今日开始关注游戏审批暂停的游戏业所面临的困境,着实让游戏业感到意外。12月4日消息,今日央视财经频道 交易时间 栏目用时20分钟着重关注了深陷囹圄之中的游..

不会超频?微软帮你轻松搞定:Win10 2H19更新的CPU超频神助攻来自操作系统的神助攻坊间吐槽AMD的CCX已久,且对Intel偷电行为早已积怨颇深。对此,两家龙头CPU研发企业也是有苦说不出:毕竟CPU性能之长短,最终还是要体现在操作系统和对应APP的使用流畅度上。窗哥来一波提速大..

Intel 10nm十代酷睿顶级核显首测:基本战平AMD Vega 10Intel 10nm Ice Lake十代酷睿处理器整合了第11代核芯显卡,架构重新设计,支持大量全新技术,同时最多提供64个执行单元,性能有了新的飞跃,也是Intel核显浮点..