今天咱们做个SpringBoot源码分析,做这个内容其实我本人是很纠结的,就是干的我的这种性格,其实也知道分析源码的重要性,但是看到有些maven坐标都导不好的同学,我的内心往往是这样的
还啥源码分析啊,大哥。先应用OK,再进入源码分析主题吧。。。
今天这期是美团送外卖的三哥要求的,送外卖的三哥说:大缤哥,你应该分析分析源码。要深入一点,只有深入才能带来快感。。。哦,不,只有深入才能有更好的认知~而且三哥还说:这个问题是每个同学成长都会带来的烦恼
好吧,那我们就分析分析SpringBoot的源码
入口类上是不是有这个蓝色的注解,有没有。说没有的看前面两篇文章去。入口类就这么一个注解就可以是入口类
之所以是入口类,点进入这个注解,会看到后面的三个注解
@SpringBootConfiguration注解没见过吧,你继续点,看到什么一个接口上是@Configuration这个注解相当于一个xml配置文件,这么说入口类是个配置类了?你说对了所以入口类也可以看成一个配置类,这就是为什么可以在入口类上配置@Bean,相当于xml配置文件配置个
一句话总结
@SpringBootApplication:是个SpringBoot入口类
@SpringBootConfiguration:就是个配置类
@EnableAutoConfiguration:自动配置的关键里面还俩注解
@AutoConfigurationPackage:默认会将启动类所在的包作为自动配置的包
@import(AutoConfigurationimportSelector.class):自动导入的秘密在这里
@ComponentScan:包扫描知道吗?你不知道包扫描的话,你告诉我,凭什么@Controller能让Spring扫描到?
说了上面一大段,最后可以看出入口类属于配置类,并且会把入口类所在包作为扫描的起始路径,这就是为什么其他类必须跟入口类一致或是子包的原因
那么还有一部分需要描述的,就是@import(AutoConfigurationimportSelector.class)这个自动配置,要说这个
你从入口类的main方法跟进入顺序是
SpringApplication.run(WfbApplication.class, args);进入run
return run(new Class>[] { primarySource }, args);接着run进入
return new SpringApplication(primarySources).run(args);还有个run进去
public ConfigurableApplicationContext run(String... args) 到了这个方法了
getSpringFactoriesInstances(...太长了省略,生活简单点吧
SpringFactoriesLoader.loadFactoryNames(type, classLoader)
loadFactoryNames(...);关键就是这里了
loadSpringFactories(...)这块代码就在上面代码下面
这么一大片代码快乐吗?loadSpringFactories中有个变量
我上面每次后错一点就代表跟进去就行,不知道我说什么的,退散~技巧其实是ctrl+f找到该代码点进去。。。
public static final String FACTORIES_RESOURCE_LOCATION = "meta-INF/spring.factories";
看到了吗!敲黑板,上源码里找这个文件
你看这个文件里的EnableAutoConfiguration看到没,想想入口类进入后上面的@EnableAutoConfiguration注解,能不能自己脑补一下她俩关系???如果可以的话,下面这一大片全是自动配置的类
//找到这行自动配置类
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,
//进这个类,看到ServerProperties吗
@EnableConfigurationProperties(ServerProperties.class)
public class ServletWebServerFactoryAutoConfiguration
继续点到类中
ServerProperties这里面就有这个属性 private Integer port;
这也是为什么yml文件中通过
server: port: 8081 #可以更改默认端口号的原因
其实灵活点,直接在yml中点这个属性就能跳到这个配置类,你不改就用默认配置,你改了就用你的,这就是所谓的约定大于配置
然后全项目搜8080能看到这个默认的配置,我就不一点点跟代码了。这也是为什么你不设置端口号,默认是8080的关系,其实这其中还有一大堆代码要跟,才能到这里,我只能说太阳从东边升起,信不信由你!!!
好了源码也看了,我就问程序猿们开心不开心!快不快乐!!嗯?嗯?!!
最后我再说一句啊。。。



