1.解读源码的意义:

为什么要解读源代码?直接使用别人封装好的框架不香吗?答案如下:

随着互联网的快速发展,加上java跨平台等强大特性,导致java程序员需求日益剧增,很多高校、培训机构都为了填补市场需求,大批量的培养java程序员,导致很多java程序员只知其然,不知其所以然。java程序员有种饱和的趋势!!!  加上疫情的原因,很多中小型公司的收入大幅下降,他们可能选择缩招或者裁员,很多只会写增删改查、只会调用api接口、只会使用框架对其原理不深入的java程序员都会面临淘汰的趋势!! 解读源码的能力成为了一种java程序员的一种优势以及能力体现!!! 

 解读源代码的意义如下:

(1)能够帮你快速精准的定位到bug出现的原因,节省你找错误解决方案的时间以及减少遇到bug时的迷茫与无所适从,这些迷茫与无所适从非常让人有挫败感,一旦这些挫败感积累到一定程度就会让人拥有放弃的冲动!!!!!

(2)提高你面试谈资的资本!!

(3)提高你学习的能力!!很多公司为了加快开发速度、减少时间成本,都会自己封装一些技术,很多时候你去一家公司工作的第一件事就是阅读公司的源代码,当你拥有源代码的阅读经历与经验,加上公司技术大佬的指点,你就能快速上手,同样也加快你学习别的框架的速度和阅读别的框架源代码的速度!

(4)提升你个人的竞争力!!   相比于只会使用别人的框架的java程序员,那些掌握框架底层原理的java程序员更加吃香!! 企业能够减少培养成本,加快开发速度进而加快产品上线速度获得市场!!   掌握框架底层原理的java程序员能够走的更加远,因为他们了解框架的底层原理,学习了大佬们的优秀设计思想,抓住核心的部分,能追上技术的潮流并且保持源源不断的学习力,对他们将来往高层的发展以及薪资的提升具有重要意义!!!

2.源码解读:

springboot:2.3.2 源代码由以下部分组成 :

(1)springboot启动类

(2)springboot自动装配

3.springboot启动类

(1)@SpringBootApplication :用来标注哪个类是启动类

(2)SpringApplication.run(xxxx.class, args) : 启动@SpringBootApplication 注解下的类

4.springboot自动装配

点开@SpringBootApplication,你会发现由两部分组成:

(1)@SpringBootConfiguration:用来表明这是springboot的配置类

    @Configuration:表明这是配置类

         @Component: 表明配置类也是一个组件

(2)@EnableAutoConfiguration:  用来表面开启自动配置

    @AutoConfigurationPackage: 自动配置包

        @Import({Registrar.class}) :   导入组件

             AutoConfigurationPackages .register :   获取主配置类(@springbootApplication标注的类)所在的包,并把这个包里所有的组件扫描到spring容器中

    @Import({AutoConfigurationImportSelector.class}) : 告诉容器导入什么组件 

        getAutoConfigurationEntry:获取自动配置的实体

        getCandidateConfigurations:获取候选配置

            SpringFactoriesLoader . loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader()): 加载指定的factoryClass并进行实例化。

            SpringFactoriesLoader . loadSpringFactories :    加载指定的factoryClass。

                classLoader.getResources("META-INF/spring.factories") //从META-INF/spring.factories中获取资源

               ClassLoader.getSystemResources("META-INF/spring.factories") //从META-INF/spring.factories中获取资源

5.总结

(1)springboot启动类 

  ①判断项目是普通的java项目还是web项目 

  ②查找并加载所有可用初始化器,设置到initializers属性中

  ③找出所有的应用程序监听器,设置到listeners属性中 

  ④推断并设置main方法的定义类,找到运行的主类。

(2)springboot自动装配

  springboot所有自动配置都是在启动的时候扫描并加载:/META-INF/spring.factories,同时获取EnableAutoConfiguration指定的值,所有的自动配置类都在这里面,但是不一定生效,需要判断条件是否成立,只要导入对应的start,就能启动对应的自动装配,配置就能成功!!

  ①springboot在启动的时候,从类路径/META-INF/spring.factories获取指定的值

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\

.....

  ②将这些自动配置的类导入容器,自动配置就会生效,帮我们自动配置

  ③xxxxAutoConfiguration:  自动配置类,  xxxxProperties: 封装配置文件相关属性 

  举个例子: 搜索 RedisAutoConfiguration

自己可以选择在application.properites文件配置相关属性

更多推荐

Springboot源码解读