点击上方“芋道源码”,选择“设为星标”
做积极的人,而不是积极废人!
源码精品专栏
摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/autoconfigure/ 「芋道源码」欢迎转载,保留摘要,谢谢!
1. 概述
2. 自动配置类
3. 条件注解
4. 配置属性
5. 内置 Starter
6. 自定义 Starter
666. 彩蛋
1. 概述
友情提示:因为本文是分享 Spring Boot 自动配置的原理,所以需要胖友有使用过 Spring Boot 的经验。如果还没使用过的胖友,不用慌,先跳转到《芋道 Spring Boot SpringMVC 入门》文章,将前两节阅读完,感受下 Spring Boot 的魅力。
Spring Boot 自动配置,顾名思义,是希望能够自动配置,将我们从配置的苦海中解脱出来。那么既然要自动配置,它需要解三个问题:
满足什么样的条件?
创建哪些 Bean?
创建的 Bean 的属性?
我们来举个示例,对照下这三个问题。在我们引入 spring-boot-starter-web
依赖,会创建一个 8080 端口的内嵌 Tomcat,同时可以通过 application.yaml
配置文件中的 server.port
配置项自定义端口。那么这三个问题的答案如下:
友情提示:为了更易懂,这里的答案暂时是表象的,不绝对精准。
满足什么样的条件?因为我们引入了
spring-boot-starter-web
依赖。创建哪些 Bean?创建了一个内嵌的 Tomcat Bean,并进行启动。
创建的 Bean 的属性?通过
application.yaml
配置文件的server.port
配置项,定义 Tomcat Bean 的启动端口属性,并且默认值为 8080。
壮着胆子,我们来看看 Spring Boot 提供的 EmbeddedWebServerFactoryCustomizerAutoConfiguration 类,负责创建内嵌的 Tomcat、Jetty 等等 Web 服务器的配置类。代码如下:
@Configuration // <1.1>
@ConditionalOnWebApplication // <2.1>
@EnableConfigurationProperties(ServerProperties.class) // <3.1>
public class EmbeddedWebServerFactoryCustomizerAutoConfiguration {
/**
* Nested configuration if Tomcat is being used.
*/
@Configuration // <1.2>
@ConditionalOnClass({ Tomcat.class, UpgradeProtocol.class })
public static class TomcatWebServerFactoryCustomizerConfiguration {
@Bean
public TomcatWebServerFactoryCustomizer tomcatWebServerFactoryCustomizer(
Environment environment, ServerProperties serverProperties) {
// <3.2>
return new TomcatWebServerFactoryCustomizer(environment, serverProperties);
}
}
/**
* Nested configuration if Jetty is being used.
*/
@Configuration // <1.3>
@ConditionalOnClass({ Server.class, Loader.class, WebAppContext.class })
public static class JettyWebServerFactoryCustomizerConfiguration {
@Bean
public JettyWebServerFactoryCustomizer jettyWebServerFactoryCustomizer(
Environment environment, ServerProperties serverProperties) {
// <3.3>
retur