24岁美团80W年薪架构师分享SprinBoot编程思想文档
前言
24岁,有些人可能还刚刚找到工作,正在默默的埋头苦干;有些人,为了生活在北漂,为了房租而不懈努力;有些人可能还没有方向,正在迷茫阶段,不知所措!
而他,24岁已经是美团的80W年薪架构师了。这到底是为了什么?
因为,他从小就热爱编程,自从13岁开始就喜欢上了编程,通过自己的不懈努力,终于考上了自己梦寐以求的大学,学习一直名列前茅!
终于,毕业那年应聘阿里,以自己优异的源码底层功底,丰富的架构思维一路过关斩将,最后彻底的征服了阿里p9面试官,顺利的拿到了阿里p6的职级,p7的薪水,后来跳槽到美团拿到80W的年薪+股票。
在偶然的情况下,有了一次交谈的机会,我就问他,为何有如此高的成就的?他就跟我说了他的经历,于是就跟我聊了很多,我真的是被他思维和技术能力深深的折服,而且我还比他大,真的太惭愧了!!
后来,他给我推荐了一份文档,开始的时候我还不在意,没有认真的来读;等我静下心来想学习的时候,突然之间想起了这份文档,我就拿起来仔细品读,果然不一般,架构思维是真的强啊!!
让我的人生从此走上了光明的道路!
今天有幸把这份springboot编程思想文档分享给大家,希望大家能够仔细品读其中的真谛,也希望能够得到大家的喜欢!!
目录
主要内容
本文开篇总览Spring Boot核心特性,逐一讨论Spring Boot官网所罗列之六大特性,然而其中两点并非Spring Boot专属,故点到为止,而将讨论聚焦在其五大特性,分别为自动装配(Auto-Configuration)、SpringApplication、外部化配置、Spring Boot Actuator和嵌入式Web容器。
第1部分总览Spring Boot
第1章初览Spring Boot;1.1 Spring Framework时代,1.2 Spring Boot简介,1.3 Spring Boot的特性,1.4准备运行环境;
第2章理解独立的Spring应用;口头上,开发人员常将Spring Boot框架构建的应用称为Spring Boot应用,然而实际上是Spring应用。在上述的Web容器中,无论Servlet容器,还是Netty Web容器,均不属于Spring家族的产品。
在传统的Spring应用中,外置容器需要启动脚本将其引导,随其生命周期回调执行Spring上下文的初始化。比较有代表性的是Spring Web中的ContextLoaderListener和Web MVC中的DispatcherServlet,前者利用servletContext生命周期构建Web ROOT Spring应用上下文,后者结合Servlet生命周期创建DispatcherServlet的Spring应用上下文。无论何种方式,均属于被动的回调执行,这也是为什么它们并没有完整的应用主导权的原因。然而当Spring Boot出现嵌入式容器启动方式后,嵌入式容器则成为应用的一部分,从本质上来说,它属于Spring应用上下文中的组件Beans,这些组件和其他组件均由自动装配特性组装成Spring Bean定义(BeanDefinition),随Spring应用上下文启动而注册并初始化。而驱动Spring应用上下文启动的核心组件则是SpringBoot核心APISpringApplication,所以是Spring应用,也可以称为Spring Boot应用。
第3章理解固化的Maven依赖;在前面的讨论中,曾引入相关的Stater 的依赖,比如org.springframework.boot:spring-boot-starter-web,org.springframework.boot:spring-boot-loader同样如此。又已知两者的版本信息均继承于org.springframework.boot:spring-boot-starter-parent,而这些特性属于Maven依赖管理的范畴,这样就降低了Spring Boot应用管理依赖的成本,因此,Spring Boot官方的描述为“We take an opinionated view of the Spring platform and third-party libraries so you can getstarted with minimum fuss.”。不过通过配置org.springframework.boot:spring-boot- starter-parent的方式存在一定的限制,因为采用单继承的方式,所以限制了其固化Maven依赖(仅限于Spring Boot相关),并且很有可能应用pom.xml拥有自定义Parent。如果需要固化其他类型的依赖则较为烦琐,如Spring Cloud依赖。Spring Boot官方文档在“13.2.2 Using Spring Boot without the ParentPOM”章节中有相关说明:
第4章理解嵌入Web容器;在Spring Boot官方网页上,明文提示开发人员Spring Boot应用直接嵌入Tomcat、Jetty和Undertow作为其核心特性,而其中并没有提及嵌入式Netty Web Server,可能是因为当前Spring Boot1.x和2.0并存,而嵌入式Netty Web Server仅属于2.0版本的新特性。这几种容器实现统称为嵌入式Web容器,容器之间是互斥关系,无法并存。不过Spring Boot项目可通过指定容器的Maven依赖来切换Spring Boot应用的嵌入式容器类型,无须代码层面的调整,不同的嵌入式容器存在专属的配置属性,自然也不再需要以WAR文件方式进行部署:
第5章理解自动装配;自动装配是存在前提的,它取决于开发人员在应用的Class Path下添加的JAR文件依赖,同时其自动装配的实体并非一定装载,所以文档使用了“attempts”(尝试)来进行描述。
当HSQLDB存在于应用的Class Path中时,开发人员不需要手动配置数据库连接的Beans,而是由Spring Boot自动装配一个内存型的数据库。不过官方如此轻描淡写地描述自动装配的示例,恐怕让人产生疑惑。能够理解的是,Spring Boot自动装配的对象是Spring Bean,所以不需要人工干预,比如通过XML配置文件或Java编码等方式组装Bean。显然,官方认为开发人员应该知道HSQLDB.同样地,它也认为Spring Boot用户熟悉Spring Framework。
第6章理解Production-Ready特性;作为Spring Boot核心特性之一,如此扼要的说明必然让人产生疑惑,不过Production-Ready概念达到了先入为主的效果。为此,也查询过不少关于“Production-Ready”名词解释的资料,如从Google中搜索关键字“Production-Ready",惊奇地发现搜索结果的首页并没有出现于任何与Spring相关的内容。
其中前三搜索结果分别是:
.Define "production-ready" - Software Engineering Stack Exchange
.What does it mean when code is 'production ready? - Quora
What does it mean to be "production ready"?- Issue #3 - mitodl…
第2部分走向自动装配;
第7章走向注解驱动编程(Annotation-Driven);相信大多数资深的开发人员在正式使用Spring Framework前,必先理解两大核心思想:loC(Inversion of Control,控制反转)和 DI(Dependency Inject,依赖注入),其推崇的理念是应用系统不应以Java代码的方式直接控制依赖关系,而是通过容器来加以管理。随后Spring Framework的作者说明其框架对IoC和DI支持的天然性。由于当时Java 5Annotation尚未发布,结合J2EE(JavaEE的前身,当时还称为J2EE)的传统,通过XML文件的方式管理Bean之间的依赖关系。
第8章Spring注解驱动设计模式;8.1 Spring @Enable模块驱动;8.2 Spring Web自动装配;8.3 Spring条件装配。
第9章Spring Boot自动装配;明显地,在自动装配ProxyAsyncConfiguration前,需要对@EnableAsync的元注解情况进行条件判断。透过现象看本质,当Spring应用自动装配某些组件时,它需要一种综合性技术手段,重新深度整合Spring注解编程模型、@Enable模块驱动及条件装配等Spring Framework原生特性,这种技术就是“Spring Boot自动装配”。
第3部分理解SpringApplication;
第10章 SpringApplication初始化阶段;SpringApplication初始化阶段属于运行前的准备阶段,大多数Spring Boot应用直接或间接地使用SpringApplicationAPI驱动Spring应用,SpringApplication允许指定应用的类型,大体上包括Web应用和非Web应用。从Spring Boot 2.0开始,Web应用又可分为Servlet Web和ReactiveWeb。当然SpringApplication也可以调整Banner的输出,配置默认属性的内容等。这些状态变更的操作只要在run()方法之前指定即可。简单而言,SpringApplication的准备阶段主要由两阶段完成:构造阶段和配置阶段。接下来分别深入讨论。
第11章SpringApplication运行阶段;SpringApplication运行阶段属于核心过程,完整地围绕run(String...)方法展开。该过程结合初始化阶段完成的状态,进一步完善了运行时所需要准备的资源,随后启动Spring应用上下文,在此期间伴随Spring Boot和Spring事件的触发,形成完整的SpringApplication生命周期。因此,下面将围绕以下三个子议题进行讨论:
SpringApplication准备阶段;
ApplicationContext启动阶段;
.ApplicationContext启动后阶段。
第12章SpringApplication结束阶段;Spring Boot 1.x和2.0版本对于SpringApplication结束阶段的实现逻辑是相对稳定的,存在SpringApplication正常结束和SpringApplication异常结束两种情况。不过在实现手段上,前后版本确实存在差异,下面进行讨论。
第13章Spring Boot应用退出;按照其字面意思,当.Spring Boot程序执行结束时,ExitCodeGenerator Bean将返回getExitCode()方法实现的退出码,不过这也暗示着一个前提条件,即Spring应用上下文必须是活动的( ConfigurableApplicationContext#isActive()方法返回true ),说明此时SpringApplication属于正常结束。相反,当SpringApplication运行异常时,退出码又是如何影响Spring Boot应用的行为呢?
这份【springboot编程思想核心篇】共有628页,因为内容实在是太多了,无法一一给大家展示出来,需要完整版的朋友,可以转发此文关注小编,点击此处来获取!!
总结
本文以Spring Boot2.0为讨论的主线,讨论的范围将涵盖Spring Boot1.x的所有版本,以及所关联的Spring Framework版本,致力于:
·场景分析——掌握技术选型
·系统学习——拒绝浅尝辄止
·重视规范——了解发展趋势
·源码解读——理解设计思想
·实战演练——巩固学习成果
希望本文能够帮会到大家的学习,让大家快速地掌握其中的技术知识,提升自己的技术深度和广度,让自己变得更有价值,也希望能够得到大家的喜欢!!