为什么要解读源代码?直接使用别人封装好的框架不香吗?答案如下:
随着互联网的快速发展,加上java跨平台等强大特性,导致java程序员需求日益剧增,很多高校、培训机构都为了填补市场需求,大批量的培养java程序员,导致很多java程序员只知其然,不知其所以然。java程序员有种饱和的趋势!!! 加上疫情的原因,很多中小型公司的收入大幅下降,他们可能选择缩招或者裁员,很多只会写增删改查、只会调用api接口、只会使用框架对其原理不深入的java程序员都会面临淘汰的趋势!! 解读源码的能力成为了一种java程序员的一种优势以及能力体现!!!
解读源代码的意义如下:
(1)能够帮你快速精准的定位到bug出现的原因,节省你找错误解决方案的时间以及减少遇到bug时的迷茫与无所适从,这些迷茫与无所适从非常让人有挫败感,一旦这些挫败感积累到一定程度就会让人拥有放弃的冲动!!!!!
(2)提高你面试谈资的资本!!
(3)提高你学习的能力!!很多公司为了加快开发速度、减少时间成本,都会自己封装一些技术,很多时候你去一家公司工作的第一件事就是阅读公司的源代码,当你拥有源代码的阅读经历与经验,加上公司技术大佬的指点,你就能快速上手,同样也加快你学习别的框架的速度和阅读别的框架源代码的速度!
(4)提升你个人的竞争力!! 相比于只会使用别人的框架的java程序员,那些掌握框架底层原理的java程序员更加吃香!! 企业能够减少培养成本,加快开发速度进而加快产品上线速度获得市场!! 掌握框架底层原理的java程序员能够走的更加远,因为他们了解框架的底层原理,学习了大佬们的优秀设计思想,抓住核心的部分,能追上技术的潮流并且保持源源不断的学习力,对他们将来往高层的发展以及薪资的提升具有重要意义!!!
springboot:2.3.2 源代码由以下部分组成 :
(1)springboot启动类
(2)springboot自动装配
(1)@SpringBootApplication :用来标注哪个类是启动类
(2)SpringApplication.run(xxxx.class, args) : 启动@SpringBootApplication 注解下的类
点开@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中获取资源
(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文件配置相关属性