美文网首页
springboot源码简析

springboot源码简析

作者: 瓢鳍小虾虎 | 来源:发表于2020-12-10 22:44 被阅读0次

    springboot作为一个开发框架为开发者提供了非常大的便利,具体表现在开发人员可以根据自己 需要通过简单的配置就可以使用想要的功能。

    为了探究spirngboot的实现,我们可以从整个程序的入口着手。


    image.png

    入口方法主要用到了SpringApplication类的run方法,和一个注解@SpringBootApplication

    自动加载

    先关注run方法


    image.png

    run方法其实就是为了创建一个应用的实例(context),其他所有的配置对象都是包装在这个实例内部的。
    这里可以看到,run方法创建了一个context对象和一个listener对象。
    然后把context对象和linstener对象还有其他配置对象组合到了一起。
    接着启动listener对context的监听功能。

    context对象:


    image.png
    image.png

    跟踪context对象的创建,发现不管最终创建的对象是哪一种,都含有reader,scanner这种属性,看到这里的命名就可以猜出这些是跟bean的加载有关的。

    再回到run方法中的prepareContext:


    image.png

    查看load方法:


    image.png
    打断点查看:
    image.png
    image.png

    打断点发现,这里是创建了一个loader,并且把注册类(context内部的一个beanFactory)和程序入口类HellomybatisApplication.class作为初始化参数,创建了一个BeanDefinitionLoader对象loader,然后通过loader.load()方法创建bean到context中。

    关于loader方法内部:


    image.png

    首先会发现此方法支持各种类型的类加载策略,打断点会发现入口类执行的是this.annotatedReader.register(new Class[]{source});
    这是注解相关的类,此时入口类上的注解@SpringBootApplication会被调用加载,这样整个springboot项目相关的配置和bean就都会被加载进来。

    自动配置

    @SpringBootApplication内部有3个重要的注解:@Configuration,@EnableAutoConfiguration和@Compone'n'tScan,@Configuration用来定义配置类,@EnableAutoConfiguration用来启用自动配置,@ComponentScan用来扫描和加载自定义的bean。

    我们知道springboot自定加载默认会扫描@SpringBootApplication所在的包和子包,那很多第三方的功能是怎么加载进来的呢?通过依赖配置可以发现,spring-boot-starter内部包含很多第三方功能的包,其中有一个叫做spring-boot-autoconfigure,启动的时候他会加载META-INF/spring-factories这个文件,这个文件内部配置了大量的第三方功能的配置类:

    image.png
    关于spring-boot-starter是如何自动加载第三方包的可以参考如下,暂时偷个懒~
    https://www.jianshu.com/p/5ac61de70ce6

    自动配置的约定优先原理:

    自动配置会优先读取项目中的配置,如果项目中没有相关配置才启用默认配置,这就是自动配置的约定优先原理。因此我们如果没有任何配置,依然可以看到项目正常启动了tomcat并且端口8080,如果我们不想使用tomcat,想用Jetty替换,
    则可以如下配置:


    image.png

    相关文章

      网友评论

          本文标题:springboot源码简析

          本文链接:https://www.haomeiwen.com/subject/auvlgktx.html