栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot快速入门及总结(3)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot快速入门及总结(3)

今天咱们做个SpringBoot源码分析,做这个内容其实我本人是很纠结的,就是干的我的这种性格,其实也知道分析源码的重要性,但是看到有些maven坐标都导不好的同学,我的内心往往是这样的

 

还啥源码分析啊,大哥。先应用OK,再进入源码分析主题吧。。。

今天这期是美团送外卖的三哥要求的,送外卖的三哥说:大缤哥,你应该分析分析源码。要深入一点,只有深入才能带来快感。。。哦,不,只有深入才能有更好的认知~而且三哥还说:这个问题是每个同学成长都会带来的烦恼


 

好吧,那我们就分析分析SpringBoot的源码

 

入口类上是不是有这个蓝色的注解,有没有。说没有的看前面两篇文章去。入口类就这么一个注解就可以是入口类

之所以是入口类,点进入这个注解,会看到后面的三个注解

@SpringBootConfiguration注解没见过吧,你继续点,看到什么一个接口上是@Configuration这个注解相当于一个xml配置文件,这么说入口类是个配置类了?你说对了所以入口类也可以看成一个配置类,这就是为什么可以在入口类上配置@Bean,相当于xml配置文件配置个 ,因为SpringBoot是纯注解式开发所以配置类中配置bean你的明白?

一句话总结

@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的关系,其实这其中还有一大堆代码要跟,才能到这里,我只能说太阳从东边升起,信不信由你!!!

 好了源码也看了,我就问程序猿们开心不开心!快不快乐!!嗯?嗯?!!

 

最后我再说一句啊。。。

 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/305997.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号