前言
Document Directory
水平暂时远做不到翻译文档, 就把官方文档的目录拿来学习一下英语
version 2.2.0
知识结构
根据课程整理知识结构
为了解决企业级应用开发的复杂性而创建的框架, 可大幅简化开发
通过以下关键策略实现的简化:
用于简化Spring开发的框架
整个Spring技术栈的大整合
J2EE开发一站式解决方案
优点
.war
包starter
自动依赖和版本管理 (控制)缺点
个人认识
架构演变:
from Dubbo Document
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ySEpDbyc-1587907368465)(SpringBoot.assets/image-20200423161837334.png)]
概念
In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API.
2014, Martin Fowler提出概念
是一种架构的风格, 一个应用可以是一组小型服务, 彼此通过轻量级的例如HTTP方式沟通
每一个功能元素
学习环境
jdk 1.8 | maven 3.x | SpringBoot 1.5.9
maven的settings.xml中添加, 按照jdk1.8编译
传统步骤
新建普通maven
添加parent标签和web起步依赖
<parent>
官网文档起步可以找到
parent>
<dependencies>
<depen>depen>
dependencies>
主程序类, org.zhangcl
@SpringBootApplication // 标注主程序类, 说明这是一个SpringBoot应用
public class HelloWorldMainApplication{
public static void main(Strring[] args){
SpringApplication.run(HelloWorldMainApplication.class, args);
}
}
业务org.zhangcl.controller.HelloController.java
@Controller
public class HelloController{
@RequestMapping
@ResponseBody
public String hello(){
return "Hello, World!";
}
}
部署
以前war包, 要在tomcat中, 但boot可以直接jar包
引入打包插件
<build>
<plugins>
<plugin>
...
plugin>
plugins>
build>
使用Maven工具中有package功能
包中有内嵌的tomcat
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>1.5.9.RELEASEversion>
<relativePath/>
parent>
parent
是SpringBoot的版本仲裁中心
它的父项目是
导入这些依赖不需要写版本
spring-boot-starter-parent-1.5.9.RELEASE.pom, Ctrl+鼠标, 看parent, 能进来此文件. 其中管理很多重要内容, 如:
没有管理的依赖仍然需要手动规定版本号
spring-boot-starter-web, "SpringBoot场景启动器"
web, 帮我们导入web模块正常运行所依赖的组件
SpringBoot将所有的功能场景抽取出来, 做成很多starters, 我们只需要在项目里引入这些starter项目场景的, 相关依赖回自动导入进来.
要用什么功能呢, 就导入对应场景启动器
主启动类HelloApplication.java
@SpringBootApplication
纯结构
List getCandidateConfigurations(...)
解释
List getCandidateConfigurations(...)
单独解释
@AutoConfigurationPackage 自动配置包的作用:
有个getPackageName()
将主配置启动类, 所在包及下边所有子包和组件扫描到Spring容器中
@Impor(EnableAutoConfigurationImportSelector.class)
给容器中导入组件
Enable…Selector, 导入那些组件的选择器
将所有需要导入的组件以全类名的方式返回, 添加到容器中!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6n5rqT3O-1587907368468)(SpringBoot.assets/image-20200426132735168.png)]
这些自动配置类, 免去我们手动编写配置注入功能组件等的工作
结论:
SpringBoot启动时从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值, 将他们作为自动配置类导入容器中, 自动配置类就生效, 帮我们进行自动配置工作以前需要我们自己配置的东西, 自动配置类都帮我们做了
J2EE的整体整合解决方案和自动配置都在Spring-boot-autoconfigure-1.5.9.RELEASE.jar
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LOJomShJ-1587907368470)(SpringBoot.assets/image-20200426133939073.png)]
.run(…)
SpringApplication.run(当前类.class, args);
开启了一个服务
参考资料
Craig Walls
这里我从
中文版的作者Craig Walls先生的书中借鉴点内容, 帮助理解
简而言之, Spring Boot的自动配置是一个运行时 (更准确地说, 是应用程序启动时)的过程, 考虑了众多因素, 才决定Spring配置应该用哪个, 不该用哪个. 举几个例子, 下面这些情况都是Spring Boot 的自动配置要考虑的.
- Spring的JdbcTemplate 是不是在Classpath里? 如果是, 并且有DataSource的Bean, 则自动配置一个JdbcTemplate的Bean
- Thymeleaf是不是在Classpath里? 如果是, 则配置Thymeleaf的模板解析器、视图解析器以及模板引擎
- SpringSecurity是不是在Classpath里? 如果是, 则进行一个非常基本的Web安全设置.
每当应用程序启动的时候, Spring Boot 的自动配置都要做将近200个这样的决定, 涵盖安全、集成、持久化、Web开发等诸多方面. 所有这些自动配置都是为了尽量不让你自己写配置.
秦疆老师
结论:
Spring Boot 所有的自动配置都是在启动的时候扫描并加载.
spring.factories, 所有的自动配置类都在这里, 不一定都生效, 需要判断条件是否成立, 只要导入了对应的starter, 就有对应的启动器, 有了启动器, 我们的自动配置才会生效!
大致流程如下:
spring-boot-autoconfigure-2.2.0.REALEASE.jar
包下源码剖析
selectors
源码路径:
@SpringBootApplication
@AutoConfigurationPackage
@Import(AutoConfigurationPackages.Registrar.class)
AutoConfigurationImportSelector
List getCandidateConfigurations(...)
candidateConfigurations
怎样知道"candidateConfigurations"在哪?
这个方法中有个参数是getBeanClassLoader()
方法的返回值
getBeanClassLoader()
this.beanClassLoader()
底层给出一个路径META-INF/spring.factories
配置类们被spring.factories管理着
具体在哪能找到?
spring.factories
具体在哪?
External Libraries
Maven:org.springframework.boot:spring-boot-autoconfigure:2.2.0.RELEASE
spring-boot-autoconfigure-2.2.0.RELEASE.jar
META-INF
spring.factories
保存了150+条候选配置类的位置url
选例研习:
HttpEncodingAutoConfiguration
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(HttpProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
...
跳入源码后从@EnableConfigurationProperties(HttpProperties.class)
跳入HttpProperties.class
发现: 配置类实体和配置文件字段的绑定
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {
...
发现@ConditionalOn…家族
// 判断条件生效: 当前是web应用 才生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
// 判断条件生效: 有指定的类 才生效
@ConditionalOnClass(CharacterEncodingFilter.class)
// 判断条件生效: 指定的属性是指定值 才生效
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
理解
个人理解
Spring Initializer
reources文件夹
结构
@RunWith(StringRunner.class)
- 用专门的驱动器
@SpringBootTest
- 标识
可以在试期间很方便地使用一种类似于编码一样的方式进行自动注入
(2.2中有详解)
配置文件
命名:
作用:
By default, the configured locations are…The resulting search order is the following:
官网规定4个位置, 优先级按顺序
file:./config/
file:./
classpath:/config/
classpath:/
补充:
file
: 是项目根目录classpath
: 是 resources根目录 | class根目录 (class这个我也不太确定)互补加载
有冲突时按优先级, 没有冲突就都拿来
甚至还可以手动指定配置文件位置
项目打包以后, 我们可以使用命令行参数的形式来指定文件新位置. 指定的配置文件和默认加载的会共同作用, 也会形成互补记载作用
SpringBoot也可以从以下位置加载配置, 优先级从高到低:
System.getProperties()
) (jvm)6~9小结:
YAML Ain’t Markup Lauguage
以数据为中心, 与XML相比
key:[空格]value
字符默认不加任何引号
"zhangsan \n lisi"
--> zhangsan 换行 lisi
'zhangsan \n lisi'
行内写法
person: {name: 张三, age: 18, id: 1001}
核心符号: -
pets:
- dog
- cat
- bird
# 行内写法
pets2: [cat, dog, bird]
(顺序不重要, 只要都存在即可)
JavaBean, Person.java中
@Component
@ConfigurationProperties(prefix = "person")
@Validated // 数据校验
public class Person{
private String name;
private Integer age;
private Map map; // map
private List list; // list
private Dog dog; // 引用
@Email(message="邮箱格式错误")
private String email;
}
class Dog{
private String name;
private Integer age;
}
@ConfigurationProperties
- 告诉Boot将本类中的所有属性和配置文件中相关的配置进行绑定
(prefix = "person")
- 从配置文件中person
属性之下进行映射
application.yaml
person:
name: zhangsan
age: 3
map: {key1: value1, key2: value2}
list:
- code
- girl
- basketball
dog:
name: wangcai
age: 3
单元测试
@Autowired
说明:
@ConfigurationProperties(prefix="person")
和yaml中的该根元素绑定@Validated
+ @Email
可以校验数据注意:
也可以实现从中取值, 只是需要考虑乱码问题
乱码问题
properties会出现这个问题, 改编码就可以
早期是从xml中的
获取value属性的值
现在可以使用**@PropertySource(..)
+ @Value
**来做同样的事情
还支持SpEL, 但不支持别的很多特性
SpEL
表达式, 所以也支持!@Component
// 绑定指定file
@PropertySource(value = "classpath:theOtherName.properties")
public class Person{
@Value("${name}")
private String name;
}
表达式
这样还支持一种在配置文件中使用表达式的功能
person:
name: zhangsan
id: ${random.int}
id2: ${random.uuid}
功能 | @ConfigurationProperties | @Value |
---|---|---|
属性批量注入 | √ | × (需要每个设置@Value) |
松散语法绑定 | √ | × |
SpEL | × | √ |
JSR303数据校验 | √ | × |
复杂类型封装 | √ | × |
配置文件位置 | 只能从全局配置文件中获取 | 可更精确指定位置 |
多文档块 | √ | × |
id: ${random.int}
, 继承自XML的优良传统@Validated
+ @Email
选择
@Value
@ConfigurationProperties
之前可以用@ImportResource
作为配置文件的导入方式
它可以把指定文件导入Spring容器
对比
@PropertySource
- 加载指定配置文件@ImporResource
- 向Spring容器中导入指定文件作为的配置文件手写配置文件导入容器作正规配置文件, 在主启动类中
@ImportResource(location = {"classpath:beans.xml"})
// 下边是主启动类
但SpringBoot推荐
@Configuration + @Bean 全注解方式
@Configuration
public class MyAppConfig {
/*
方法名 组件id
返回值 组件class
*/
@Bean
public HelloService helloService(){
System.out.println("配置类@bean给容器中添加组件");
return new HelloService();
}
}
class HelloService{}
配置文件处理器 (configuration-processor)
配置文件自动提示
官方建议, 导入这个依赖写配置会自动和JavaBean绑定, 会有自动提示
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
JSR303数据校验
@Validated
+ @Email\或别的
@ConfigurationProperties
才支持
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2nEhh9N3-1587907368473)(SpringBoot.assets/image-20200424213231750.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwEjcf5V-1587907368474)(SpringBoot.assets/image-20200424213301075.png)]
分类
随机数
${random.value}
${random.int} \ ${random.int(10)} \ ${random.int(1024,65536)}
${random.long}
占位符, 获取之前的值
app.name=APPNAME
app.description=${app.name} is a 666 application
app.description2=${app.lastname:hello} # 如果获取不到也可以走默认值hello
适用
properties | yaml 都支持
是Spring对不同运行环境提供不同配置支持的功能, 可以通过激活指定参数等方式快速切换环境
先注意命名:
application
开头, 比如:
application-test.properties
application-dev.properties
再选则: 在application.properties
中
# 1. 如果不设置, 默认找application.properties
# 2. 设置
spring.profiles.active=dev
# or
spring.profiles.active=test
在application.yml
同一个文件中即可配置:
server:
port: 8081
#选择激活方案 如果不选择激活, 则81
spring:
profiles:
active: dev
#方案
---
server:
port: 8082
spring:
profiles: dev
#方案
---
server:
port: 8083
spring:
profiles: test
配置文件中激活
(如上所述)
命令行激活
运行之前选择Edit Configurations...
--> Program arguments:
--> 以下命令
--spring.profiles.active=dev
或者在cmd命令行中运行时候再指定以上命令
java -jar 项目包名 --spring.profiles.active=dev
JVM参数参数
还在运行之前选择Edit Configurations...
--> VM options
– 输入以下
-Dspring.profiles.active=dev
配置文件到底能写什么, 记不住, 但如果懂原理, 会好很多
SpringBoot启动时, 加载主配置\启动类, 开启了自动配置功能 @EnableAutoConfiguration
@EnableAutoConfiguration作用:
利用EnableAutoConfigurationImportSelector给容器中导入一些组件
在其父类AutoConfigurationImportSelector查看selectImports()方法的内容
其中有个方法名为"获取候选配置们"的, 会返回一个configurationrations的候选配置对象,如下
List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);
本来是个List
, 但在被外围总方法返回出去之前转换成数组array
它的底层是SpringFactoriesLoader.loadFactoryNames()
作用是扫描所有jar包类路径下的META-INF/Spring.factories
把扫描到的这些文件的内容包装成properties对象, 从properties中又获取EnableAutoConfiguration.class类 (类名)对应的值, 然后加载到容器中
将类路径下 META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到容器中, 每一个这样的xxxAutoConfiguration都是容器中的一个组件, 都加入到容器中. 这是"源", 只有他们都加入容器, boot才能正常启动
# "源"
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\
org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\
org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\
org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
以HttpEncodingAutoConfiguration为例解释自动配置原理
@Configuration // 标识是一个配置类, 以前编写的配置文件一样, 它也可以给容器中添加组件
@EnableConfigurationProperties(HttpEncodingProperties.class)
// 上边注解: 启用指定类(HttpEncodingProperties.class)的@ConfigurationProperties功能: 和配置文件绑定功能
@ConditionalOnWebApplication // Spring底层的@Conditionalxxx, 如果满足指定条件, 该配置类中的配置才会生效
// 上边这个注解作用: 判断是否为web应用
@ConditionalOnClass(CharacterEncodingFilter.class)
// 上注解作用: 判断当前项目是否存在指定的类, SpringMVC的编码过滤器
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
// 上注解作用: 判断配置文件中是否存在指定配置 matchIfMissing 如果不存在, 判断也成立
// 上注解作用2: 即使配置文件中不配置spring.http.encoding=enable, 也会默认生效
public class HttpEncodingAutoConfiguration {
private final HttpEncodingProperties properties;
// 只有一个有参构造, 则参数只能从容器中拿
public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
this.properties = properties;
}
@Bean // 本类一旦生效, 这个bean成为一个组件加入容器
// 这个组件的某些值需要从properties中获取值, 而这个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;
}
@Bean
public LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {
return new LocaleCharsetMappingsCustomizer(this.properties);
}
private static class LocaleCharsetMappingsCustomizer
implements EmbeddedServletContainerCustomizer, Ordered {
private final HttpEncodingProperties properties;
LocaleCharsetMappingsCustomizer(HttpEncodingProperties properties) {
this.properties = properties;
}
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (this.properties.getMapping() != null) {
container.setLocaleCharsetMappings(this.properties.getMapping());
}
}
@Override
public int getOrder() {
return 0;
}
}
}
这整个类的作用, 根据当前不同的条件, 决定此配置类是否生效! 都成立了, 就生效了!
一旦生效了然后呢? 这个自动配置类中的@Bean 会注入容器, 作为组件添加到容器中!
这个组件工作时需要从本类的properties中获取某些值, 而这个properties的属性都已经通过@ConfigurationProperties和配置文件映射了!厉害!
并且只有一个有参构造, 参数就是这个properties, 只能从容器中拿.
重要组件
底层
作用
@Conditional…指定的条件成立, 才给容器中添加组件.
比如
"条件性"地生效
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mbz6YuaJ-1587907368476)(SpringBoot.assets/image-20200425000946631.png)]
AutoConfiguration需要在一定条件下生效!
补充:
这个只作为理解的补充
放大HttpEncodingProperties.class
@ConfigurationProperties(prefix = "spring.http.encoding") // 作用:从配置文件中获取指定的值, 以及同bean的属性绑定
public class HttpEncodingProperties {
//...
}
所有可以在配置文件中配置的属性都是在这种XXXProperties类中封装着! 配置文件可以配置什么, 就可以以此为参照!
可以看到具体哪些自动配置类生效, 哪些未生效
开启:
配置文件中输入
debug: true
日志有以下部分:
“AUTO-CONFIGURATION REPORT” 自动配置报告