前言
我只是一名尚未参加工作的大学生,纯纯的springboot小白,本文仅用作自己学习记录使用。若其中出现任何错误,都欢迎指出,如果在我查阅资料后发现确实是我的错误,那将会立即更正,请不要喷我。
本篇文章参考了大量CSDN已有的博客,且我本人也查阅了相关的springboot源代码。
正文
首先让我们从头开始。
众所周知,springboot应用在启动类上都有一个注解,@SpringBootApplication;
这个注解如果朋友们打开它的声明,就会发现里面还有三个(不只是三个,但是本文只关心这三个)注解;
分别是@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan;
其中的@SpringBootConfiguration和@Configuration是差不多意思的,只不过@SpringBootConfiguration允许自动找到配置。
注意看高亮部分的注释。
然后我们再点开里面的@Configuration注解的声明,里面有一个@Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector里面有一个selectImports()方法,再次往下深入,就会发现一个叫做getCandidateConfigurations()的方法。
显然,从方法名就能看出来,这就是拿到默认配置类(不是默认配置!不是默认配置!不是默认配置!)的地方了。源代码如下所示:
这时候一定会好奇,这个META-INF/spring.factories里面到底是什么。如下图所示:
这些其实就是自动配置类(java config)的全限定名。打开其中一个叫ServletWebServerFactoryAutoConfiguration的类进去看看。就会发现如下图所示的东西:
注意看红色框框的内容,@EnableConfigurationProperties(ServerProperties.class)的意思是把已经添加了默认配置属性的ServerProperties注入进来。
需要注意的是,ServerProperties长这样:它头上有一个注解@ConfigurationProperties与@EnableConfigurationProperties配合使用。
这里就表示去填充在spring-configuration-metadata.json中,并且以server开头的数据了。
著名的8080也在这里(虽然这里不写也无所谓,tomcat底层实现时已经把端口默认设置成了8080。)
到这里,springboot的自动配置就算是完成了。如果需要自定义配置,具体可以参考下面这篇博客。
https://www.jianshu.com/p/57fec884c017
最后
希望可以引用大佬的一段话来结尾(侵删):