Spring源码开整
该系列以手写spring framework中的核心部分帮助理解源码
1. 目标
- 为什么需要spring
- 搞清楚spring全家桶常用技术
- 搞清楚spring框架的主要职责
- 搞清楚spring框架和springboot的区别
- 搞清楚spring框架中各模块的作用
- 搞清楚spring中的核心概念,基础容器、高级容器、ioc容器、ioc、aop、di、bop、循环依
赖等
2. 概念解析
2.1 为什么需要spring
Spring是个一站式解决方案,使创建Java企业级应用程序变得很容易。它提供了在企业环境中使用Java语言所需的一切,支持Groovy和Kotlin作为JVM上的替代语言,并具有根据应用程序的需要创建多种体系结构的灵活性。
Spring支持广泛的应用程序场景。而且其社区活跃会受到来自全世界开发者的真实企业应用场景反馈,spring则会根据这些反馈不断迭代适应时代需求。
大白话:开发是为了什么?赚钱啊!怎么能多赚钱,当时是在相同时间干更多的活完成更多的项目。Spring让你开发的更快效率更高香不香?项目一期做完了要不要做二期做二期要不要考虑扩展,考虑扩展要不要有个优秀的项目基础,不然改起来不改死个人。项目跑起来了要不要维护代码,项目维护难易程度会不会影响人力投入。那现在好了,spring给你打了个非常稳固的地基让一切变得简单,还是开源的,爱了爱了。
ps:既然产能提高了,那赶快加班生产吧。
最后上官方自夸:
“We use a lot of the tools that come with the Spring framework and reap the benefits of having a lot of the out of the box solutions, and not having to worry about writing a ton of additional code—so that really saves us some time and energy.”
关键点:Spring is everywhere,Spring is flexible,Spring is productive,Spring is fast,Spring is secure,Spring is supportive
2.2 搞清楚spring全家桶常用技术
说到全家桶,我们先来看看spring都能干什么
对应的就有了spring的各个项目,前文说过spring覆盖了大部分企业级应用场景,项目有点多原谅我我把图横着放了。(ps:因为不是每个都会给出解释,这里只给出以后会讨论的)
- spring framework: spring的基石,企业级基础项目开发基础设施支撑
- springmvc:针对浏览器/服务器这种BS结构开发的框架。
- springboot: 更容易的去创建生产级别独立的工程,"0配置"直接运行
- spring data:数据范围支撑,基于spring的编程模型提供便捷的访问,其实就是把各种client做了封装
- spring cloud: 便捷构建分布式系统,很多博客直接把它称为"微服务框架"。确实是目前做微服务的首选
其他的一些因为笔者目前还没有用到,等有了深入了解再做补充
大白话:spring家族体系很大,如果想全部搞懂需要花费大量精力,先到官网做个大致了解,等有了具体应用场景或者有空闲再做深入研究。
2.3 搞清楚spring框架的主要职责
来吧spring正式开整了。Spring是从EJB那边发展过来的克服了很多ejb的确定如果想具体了解可以去读一下《export one-on-one J2EE Development without EJB》该书阐述了spring的基本设计理念。到目前我们需要知道spring是基于大量的企业级开发经验与实践而总结出的一套行之有效的综合编程配置模型。spring封装了业务无关的代码,让开发者更加聚焦业务。
大白话:spring给大家把厨房锅碗瓢盆都准备好了(依赖注入),今天想做什么菜直接开整,再也不用到超市去找锅找瓢买回来了(服务查找)。
ps:spring是基石在现在大谈微服务云原生的时候模式下面的几个东西才是用的最多的,但是真的不要着急,先学spring在看其他这个逻辑上是没有问题的属于学技术自底向上的学习流程。使用上直接用以下这些提高开发效率先用着,但是封装了什么还是要看看spring。
2.4 搞清楚spring框架和springboot的区别
spring提供基础设施,但是基于xml配置(v3提供基于注解的配置)的配置维护其实也不是一个简单的工作。另外各依赖见的版本选择也很容易出现冲突导致各种意料之外的问题。下面是SSM与SpringBoot的依赖对比,而且springboot的配置也比Spring framework要简单,毕竟约定大于配置的设计哲学还是很好用的。
SpringBoot可以看做是Spring Framework的一个升级,各种启动依赖解决了配置与版本的问题。但是其核心还是Spring Framework。
2.5 搞清楚spring框架中各模块的作用
Spring框架是一个分层的架构,它的功能被有组织的分散到约20个模块中。从图中可以看到他们划分成了几个部分,下面我们一一展开来讨论。如果英语能力较强可以看下:https://docs.spring.io/spring/docs/4.3.27.RELEASE/spring-framework-reference/htmlsingle/#overview-modules spring官方的介绍,毕竟学习框架还是要从官方文档开始。笔者略微调整介绍顺自底向上来进行说明。
2.5.1 Test
test模块当然是用来进行测试的。它支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。想想使用过的小伙伴都会对下面的代码很熟悉,它会提供与ApplicationContext一致加载的上下文。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/config/Spring.xml")
public class Test {
@Autowired
private TestService testService;
@Test
public void testXxxx() {
testService.Xxxx();
}
}
2.5.2 Core Container
核心容器包含了以下几个模块: spring-core
, spring-beans
, spring-context
, spring-context-support
, 和spring-expression
(Spring Expression Language)。
spring-core
和spring-beans
共同构成了Spring的基础,也是就是提供了IoC与DI的能力。而我们经常提到的BeanFactory
也是由spring-beans
提供管理各种bean对象。spring-context
上下文实际上是基于上面的模块提供各种企业级需求的,它重要的就是ApplicationContext
.可以说BeanFactory和ApplicationContext共同构成了Spring IoC容器的基础。spring-context-support
提供了对集成通用第三方库的支持,比如缓存、消息队列、任务调度、模板引擎。spring-expression
提供了一种强大的表达式语言,用于在运行时查询和操作对象图
大白话:spring-core
和spring-beans
是基础,spring-context
和spring-context-support
提供了对基础容器的扩展,spring-expression
笔者用到的地方很少
2.5.3 AOP and Instrumentation
spring-aop模块提供了允许自定义的与AOP兼容的面向切面编程的实现。就是是对AOP的支持。
spring-instrument模块提供了类检测支持和类加载器实现,以在某些应用程序服务器中使用。
2.5.4 Messaging
Spring Framework 4包括一个Spring消息传递模块,其中包含来自Spring集成项目的关键抽象,如消息、MessageChannel、MessageHandler等,可作为基于消息的应用程序的基础。消息队列总玩过吧。
2.5.5 Data Access/Intergration
它由JDBC、ORM、OXM、JMS和事务模块组成,对这些能力提供支持。这些名词算是java必须知道的东西了:
- JDBC(java database connection)连数据库定义的一套接口
- ORM(object relational mapping)比如hibernate、mybatis就是这方面的优秀框架
- OXM( Object/XML mapping)比如Castor
- JMS(Java Message Service)消息服务,从Spring 4.1开始,它提供了与Spring Messaging模块的集成。
2.2.6 Web
spring-web模块提供基本的面向web的集成特性,例如mutil-part文件上传功能,通过Servlet Listener和WebApplicationContext来初始化IoC容器。
Spring -webmvc模块(也称为Web- servlet模块)包含Spring的模型-视图-控制器(MVC)和Web应用程序的REST Web服务实现。
spring-webmvc-Portlet模块(也称为Web-Portlet模块)提供了在Portlet环境中使用的MVC实现。
2.6 搞清楚spring中的核心概念
基础容器、高级容器、ioc容器、ioc、aop、di、bop、循环依赖。
核心概念
- BOP:面向Bean的编程,在Spring体系里一切都是针对Bean进行设计和实现。
- 基础容器产生Bean实例的时机,是第一次被调用的时候,才产生
- 高级容器是服务启动的时候,就会创建所有单例的bean实例。
- IoC:控制反转,指的是创建Bean实例的角色发生了反转,由程序员主动new变为框架为
你new,它离不开DI (alse known as DI) - DI:依赖注入,就是设置成员变量。
- AOP:面向切面编程,和OOP一样都是一种开发思想。
- 循环依赖: A–>B B–>A形成闭环
- 构造方法的循环依赖(无法解决的)
- setter方法的循环依赖(Spring使用三级缓存技术解决)
需要特别提出来说的是基础容器BeanFactory和高级容器AppicationContext。
BeanFactory是spring-beans所提供的接口,提供能够管理任何类型对象的高级工厂。
ApplicationContext是BeanFactory的子接口,它增加了与Spring的AOP特性的集成、用于国际化以及特定于应用程序层的上下文,如web应用程序中使用的WebApplicationContext。ApplicationContext是BeanFactory的一个完整超集。