自动配置原理|学习笔记

简介: 快速学习自动配置原理

开发者学堂课程【SpringBoot快速掌握 - 核心技术自动配置原理】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/612/detail/9231


自动配置原理


内容介绍

一、自动配置原理解释

二、自动配置原理

三、总结精髓

 

一、自动配置原理解释

前边学习 Springboot 配置文件的加载位置,可以在

- file..config/

- file:/

- classpath:/config/

- classpath:/

这四个位置来配置文件。也学习了 Springboot 可以用外部配置来配置加载,外部配置也可以写在很多来源里,如:命令行参数、来自 java:comp/env 的 JNDI 属性等,都能正常工作。演示以 server.boot 为例,调试服务器的端口。那么,配置文件到底能写什么?怎么写?自动配置原理又是什么?

解释自动配置原理

创建一个新工程,打开 file,选择 New,点击 Next,spring 触发器,在 Project Metadata 里填入

Group:  com.atguigu

Artifact:spring-boot-02-config-autoconfig

把 Package:包名写简单些

Package:com.atguigu.springboot

点击下一步,选择 web 模块,勾选右侧 web,Spring Boot 的版本选择 1.5.10,点击下一步,创建工程。

看工程目录结构,看配置文件没有问题。把 .mvn、.gitignore、mvnw、

mvnw.cmd 这些文件删除。

以前靠提示写配置文件,改服务器端口 server.port=8080等,能写的这些是有依据的。

第一种依据,看 Spring Boot 的官方文档,在最后一章的目录里面,有介绍能写哪些配置。Appendices 目录下,

A. Common application properties 统称能配置的属性。

哪些能在application.properties / application.yml指定呢?

……

# CORE PROPERTIES

#

# BANNER

banner. charset=UTF-8 # Banner file encoding.

banner . location=classpath: banner.txt # Banner file Location.

……

# LOGGING

……

这里列举了每一个属性,包括属性解释。

配置文件能配置的属性参照下边链接的文档内容:

https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#common-application-properties

但参照文档或者提示等都比较麻烦。只有自己理解透自动配置的原理,才能随心所欲的运用。

 

二、自动配置原理

自动配置原理:

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

2. @EnableAutoConfiguration 作用:

(1)利用EnableAutoConfigurationlmportSelector给容器中导入一些组件

(2)可以查看selectlmports()方法的内容 ;

(3)List configurations= getCandidateConfigurations

(annotationMetadata, atributes);获取候选的配置

SpringFactoriesLoader .loadF actoryNames()

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

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

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

当 SpringBoot 应用启动的时候,是从主方法 main 里边进行启动的。主要加载了 SpringBootApplication 配置类,最主要的功能是开启了@EnableAutoConfiguration 的自动配置。

(4)@EnableAutoConfiguratio n 的作用。

打开 SpringBootApplicationjava

点击 @EnableAutoConfiguration 注释。

EnableAutoConfiguration.java 里,主要利用 @Import(Enab leAutoConfigurationImportSelector.class) 这个选择器给 Spring 容器中导入一些组件。

总结一句话就是:

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

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

3.每一个自动配置类进行自动配置功能;

4.以 HttpEncodingAutoConfiguration ( Http编码自动配置)为例解释自动配置原理;

打开 HttpEncodingAutoConfiguration.java

看到配置类,注解:

@Configuration //表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件

@EnableConfigurationProperties(HttpEncodingProperties

.class) //启动指定类的ConfigurationProperties功能;

@ConditionalOnvebApplication

@ConditionalOnClass(CharacterEncodingFilter.class)

@ConditionalOProperty(prefix="spring.http.encoding", value = "enabled", matchIfMissing =true)

public class HttpEncodingAutoConfiguration {

5.所有在配置文件中能配置的属性都是在xxxxProperties类中封装者;配置文件能配置什么就可以参照某个功能对应的这个属性类

1  @ConfigurationProperties(prefix = "spring .http. encoding") //从配置文件中获取指定的值和bean的属性进行绑定

2 public class HttpEncodingProperties {

3

4 public static final Charset DEFAULT CHARSET = Charset . forName("UTF-8");

 

三、总结精髓

1.SpringBoot 启动会加载大量的自动配置类

2.看需要的功能有没有 SpringBoot 默认写好的自动配置类;

3.再来看这个自动配置类中到底配置了哪些组件; (只要要用的组件有,就不需要再来配置了)

4.给容器中自动配置类添加组件的时候,会从 properties 类中获取某些属性。就可以在配置文件中指定这些属性的值。

也就是说,properties 跟配置文件绑定的。这就是 Springboot 的精华。如果要使用 Springboot,Springboot 有非常多的这种模式。

xxxAutoConfigurartion :自动配置类;

给容器中添加组件

xxxxProperties:封装配置文件中相关属性;

每一个功能都如此。同时,Springboot 设计也非常清晰。比如要用自动配置。有哪些?搜索自动配置。用 ctrl+n,打开快捷搜索。

搜索 *AutoConfiguration  回车。看到,有 DataSource

数据源的自动配置,有 Elasticsearch、有 Cassandra,还有 Artemis 等等。打开CacheAutoConfiguration.java ,看到有相应的自动配置类CacheAutoConfiguration,有相应的属性CacheProperties

能配指定的 spring.cache

这就是自动配置的原理。

看 Springboot 自动配置了什么,如果没有就自己添加,如果有,用 Springboot 的配置,如果哪些属性不满意,就在配置文件里配置,配置文件里会有对应的 Properties 封装。这就是 Springboot 的用法。

 

相关文章
|
5月前
|
网络协议 算法 数据库
IS-IS原理与配置
IS-IS原理与配置
|
6月前
|
Java 程序员 数据库
SpringBoot实现固定、动态定时任务 | 三种实现方式
SpringBoot实现固定、动态定时任务 | 三种实现方式
278 0
|
Java 数据库 开发者
自动配置要点解读
自动配置要点解读
|
存储 运维 NoSQL
redis集群详细搭建方式(含原理、操作指令、异常处理)
1.概述 概念: redis集群是从3.0版本开始支持的一个功能,是redis的一种水平扩展方式,将全局数据分散的存储在N个结点上,从而来将请求流量打散到各个结点上,减轻单结点压力。 实现原理: redis的集群进行数据散列时使用了一致性hash算法的思想,如果对一致性hash算法有兴趣可以参照博主的另一篇文章:
983 0
|
Prometheus Kubernetes Cloud Native
Flagger(应用自动发布)介绍和原理剖析
## 简介 [Flagger](https://github.com/weaveworks/flagger)是一个能使运行在k8s体系上的应用发布流程全自动(无人参与)的工具, 它能减少发布的人为关注时间, 并且在发布过程中能自动识别一些风险(例如:RT,成功率,自定义metrics)并回滚. ## 主要特性 ![features](https://intranetproxy.ali
4483 0
|
Linux 数据安全/隐私保护 开发者
默认配置单机版演示|学习笔记
快速学习默认配置单机版演示。
默认配置单机版演示|学习笔记
|
Java Linux 数据安全/隐私保护
默认配置单机版演示 | 学习笔记
快速学习默认配置单机版演示
默认配置单机版演示 | 学习笔记
|
Java 开发者 Sentinel
Sentine 实现动态服务限流演示 | 学习笔记
快速学习 Sentine 实现动态服务限流演示
112 0
Sentine 实现动态服务限流演示 | 学习笔记
|
Java 开发者 Spring
项目启动加载限流规则代码|学习笔记
快速学习项目启动加载限流规则代码
|
前端开发 Java 开发者
SpringMVC 自动配置原理|学习笔记
快速学习 SpringMVC 自动配置原理