最近学习了一句话,感觉自己的世界瞬间明朗,不再那么紧张焦虑恐慌,同样推荐给大家,希望我们都终有所得。
“如果一个人不是发自内心地想要做一件事情,那么,他是无法改变自己的人生的。” 同样这句话用在学习上依旧适用,作为Java语言从业者,很早之前就知道要学习Spring源码、要掌握Spring源码,当时的理由是因为Spring源码面试官要问,知道Spring源码,薪资可以要的更高。其实这些都是外部的理由,处于压力去掌握,去学习,一旦没有了找工作,涨薪的压力,那学习源码可能就抛之脑后了。所以每次准备换工作的时候,学习Spring基本上都是从头开始,而且每次掌握的程度差距基本不大。其中细微的差距可能是来源于工作中对Spring中用到的地方多了那么一丢丢。
这次学习Spring源码,同样是因为想要职位上的晋升,要说为什么敢说这次和以往有些不同呢?几件事情的碰撞
上面四个理由,可能对大家最有帮助的是第3点,为什么意识到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工厂是用于生成bean
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 {
}
来个图,方便上述关系梳理
没有Bean的统一管理,需要什么就去new(Java的世界万物均可new,于是我顺手new了个boyFriend,可惜还没实例化出来)。如果当我们的项目有上百个乃至更多的Class的时候我们该怎么管理?如果每个都需要new,且不说对象怎么管理,机器的内存占用也是浪费的。
为什么目前日常开发过程没有这些苦恼?那是因为Spring中IOC帮我们去管理了,那它是怎么管理的呢?如果技术对于自身来说不只是谋生的手段而且也有些许好奇心,恭喜,那么你对于Spring源码有些了解的意愿了。Spring帮助我们做的不只有上述列举的这一丢丢。上面说到Spring解决的问题,以及工作使用的Springboot,SpringCloud又都是怎么实现的呢?
可能大家会说Spring都帮我们处理了,专注业务就可以了,还了解Spring源码能用到哪里呢?技术的发展日新月异,例如日常会用到的Redis,ES,Dubbo,Druid等等,请问这些独立框架是怎样和Spring整合的呢?如果公司自研的框架需要和Spring整合,这份工作我们能否承担,还是摊摊手说我无能为力啊。想要做和Spring整合的中间件,不了解Spring源码是无法胜任的。每一位拥有期许,渴望的程序员,都会能找Spring的应用点,让所学有呈现的机会。
作为一名程序员认为改变这个世界的不是程序员,是那些有想象力的人才。如果仅把自己定义为程序员,是没有思想的,我们一直在实现的是产品经理的想法,产品经理想要的世界,现代生活是想象力和思想的改变,科技只是将别人的思想转换到真实世界上。Spring虽然是一款框架,但是更是一款产品,是IOC和AOP的设计理念,让日常开发变得更容易。相比从Spring源码获得执行流程,真正学会Spring的使用,我更愿意去体会设计思想,汲取营养,野蛮成长。