【源码Spring系列】——为什么学习Spring源码 忘是亡心i 2023-02-11 11:26 2阅读 0赞 最近学习了一句话,感觉自己的世界瞬间明朗,不再那么紧张焦虑恐慌,同样推荐给大家,希望我们都终有所得。 “如果一个人不是发自内心地想要做一件事情,那么,他是无法改变自己的人生的。” 同样这句话用在学习上依旧适用,作为Java语言从业者,很早之前就知道要学习Spring源码、要掌握Spring源码,当时的理由是因为Spring源码面试官要问,知道Spring源码,薪资可以要的更高。其实这些都是外部的理由,处于压力去掌握,去学习,一旦没有了找工作,涨薪的压力,那学习源码可能就抛之脑后了。所以每次准备换工作的时候,学习Spring基本上都是从头开始,而且每次掌握的程度差距基本不大。其中细微的差距可能是来源于工作中对Spring中用到的地方多了那么一丢丢。 # Spring源码学习起因 # 这次学习Spring源码,同样是因为想要职位上的晋升,要说为什么敢说这次和以往有些不同呢?几件事情的碰撞 1. 疫情让换工作晋升涨薪,变得更加艰难 2. 互联网已经从那个站在风口上猪都能飞的疯狂时代,更加趋向于理智,更加需要真正的本领,而不是面试造火箭,入司拧螺丝 3. 买了相关课程,老师讲的很好,我突然意识到学习Spring源码是有简单,有价值,有意义,有乐趣的事情 4. 上边那句话,翻译下,发自内心想学Spring,那么我就应该真正的掌握Spring吧。 上面四个理由,可能对大家最有帮助的是第3点,为什么意识到Spring源码是有简单,有价值,有意义,有乐趣的事情。 阐述原因之前先聊几个问题 1. Spring是什么? 2. Spring解决了什么问题? 3. 熟知Spring能用在哪里? # Spring是什么? # 官网定义 The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform. A key element of Spring is infrastructural support at the application level: Spring focuses on the "plumbing" of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。**Spring的核心是控制反转(IoC)和面向切面(AOP)**。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。 # Spring解决了什么问题? # * 方便解耦,简化开发 (高内聚低耦合) Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理spring工厂是用于生成bean * AOP编程的支持 Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能 * 声明式事务的支持 只需要通过配置就可以完成对事务的管理,而无需手动编程 * 方便程序的测试 Spring对Junit4支持,可以通过注解方便的测试Spring程序 * 方便集成各种优秀框架 Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持 降低JavaEE API的使用难度。Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封 装,使这些API应用难度大大降低 上边阐述的都是大家熟知的Spring的优点,也许因为使用Spring框架让开发人更专注业务,以至于忘记原来这些便利都是因为Spring框架带给我们的。利用了Spring开发工程模样是这样的,写个注解,配置包扫描,甚至用代码生成工具,这都不用搞,就直接在开发的过程利用@Autowire注入下,遇到事务的用@Transactional,然后写逻辑就行了。 帮大家回想下最原始的Java开发工程项目的模样 public class A { public A() { B b = new B(); System.out.println(b.getClass().getName()); D d = new D(); System.out.println(d.getClass().getName()); } } public class B { public B() { C c = new C(); System.out.println(c.getClass().getName()); } } public class C { public C() { D d = new D(); System.out.println(d.getClass().getName()); } } public class D { } 来个图,方便上述关系梳理 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYWRhamluZzI2Nw_size_16_color_FFFFFF_t_70][] 没有Bean的统一管理,需要什么就去new(Java的世界万物均可new,于是我顺手new了个boyFriend,可惜还没实例化出来)。如果当我们的项目有上百个乃至更多的Class的时候我们该怎么管理?如果每个都需要new,且不说对象怎么管理,机器的内存占用也是浪费的。 为什么目前日常开发过程没有这些苦恼?那是因为Spring中IOC帮我们去管理了,那它是怎么管理的呢?如果技术对于自身来说不只是谋生的手段而且也有些许好奇心,恭喜,那么你对于Spring源码有些了解的意愿了。Spring帮助我们做的不只有上述列举的这一丢丢。上面说到Spring解决的问题,以及工作使用的Springboot,SpringCloud又都是怎么实现的呢? # 熟知Spring能用在哪里? # 可能大家会说Spring都帮我们处理了,专注业务就可以了,还了解Spring源码能用到哪里呢?技术的发展日新月异,例如日常会用到的Redis,ES,Dubbo,Druid等等,请问这些独立框架是怎样和Spring整合的呢?如果公司自研的框架需要和Spring整合,这份工作我们能否承担,还是摊摊手说我无能为力啊。想要做和Spring整合的中间件,不了解Spring源码是无法胜任的。每一位拥有期许,渴望的程序员,都会能找Spring的应用点,让所学有呈现的机会。 # 放到最后的话 # 作为一名程序员认为改变这个世界的不是程序员,是那些有想象力的人才。如果仅把自己定义为程序员,是没有思想的,我们一直在实现的是产品经理的想法,产品经理想要的世界,现代生活是想象力和思想的改变,科技只是将别人的思想转换到真实世界上。Spring虽然是一款框架,但是更是一款产品,是IOC和AOP的设计理念,让日常开发变得更容易。相比从Spring源码获得执行流程,真正学会Spring的使用,我更愿意去体会设计思想,汲取营养,野蛮成长。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYWRhamluZzI2Nw_size_16_color_FFFFFF_t_70]: https://img-blog.csdnimg.cn/20200523161927966.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYWRhamluZzI2Nw==,size_16,color_FFFFFF,t_70
还没有评论,来说两句吧...