开发者学堂课程【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
……
这里列举了每一个属性,包括属性解释。
配置文件能配置的属性参照下边链接的文档内容:
但参照文档或者提示等都比较麻烦。只有自己理解透自动配置的原理,才能随心所欲的运用。
二、自动配置原理
自动配置原理:
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 //
表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
@
Enab
le
ConfigurationProperties(HttpEncodingProperties
.class) //
启动指定类的ConfigurationProperties功能;
@ConditionalOnvebApplication
@ConditionalOn
Class(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 的用法。