2

你好,Spring!

 3 years ago
source link: https://segmentfault.com/a/1190000038687016
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

交个朋友

拿人钱财替人干活儿,在不影响工作的前提下,想做到很高频率的更新很难,但是我也尽力输出,不能为了写而写,宁缺毋滥吧。

我的想法是这样的,接下来的一段时间专门写Spring框架。整体思路就是:入门知识 --> 实际应用 --> 构建简易Spring框架 --> 看一下核心模块源码,争取早日写完这个Spring系列。用最通俗的语言来把“春天”给写好。

Spring简介

猜测项目创始人Rod Johnson希望这个框架像春天一样充满生机与活力,事实也正如这位音乐专业的计算机大佬所愿,截止目前 Spring Framework 已经更新到 Spring 5.3.2 版本并在GitHub上已经斩获40K+的star了。

Spring Framework是一个分层的全栈轻量级框架,目前凡事采用Java语言开发,几乎都会和它有染。框架内有两个核心思想:IOC(Inversion Of Control)和AOP(Aspect Oriented Programming),凭借着这两个思想帮助我们封装了很多组件,简化了开发流程,同时它的可扩展性也非常强,因此可以很方便的集成市面上很多优秀的框架,就像王健林的万达,只要商场建的好,就能吸引很多优秀的商家和买家。

Spring架构总览

引用一张官图展示Spring的架构:

A7faQ3n.png!mobile

自上而下可以分为四层:

  1. 第一层分为两个模块:

    1. 数据访问层,具体组成图中有展示,主要是封装了JDBC操作过程中的很多模板化代码。由于对ORM映射的支持,集成了MyBatis以及Hibernate等很哇塞的持久层框架
    2. web层,支持Servlet协议以及WebSocket等通讯协议,使得能够同其它应用实现远程通讯及相互调用。同时支持使用SpringMVC对该层进行扩展。
  2. 主要是对AOP的一些支持,是我们使用切面编程的支撑,AOP的存在帮助我们提取代码中的一些非业务功能的公共逻辑。
  3. Core Container,Spring的核心部分,所有Bean的创建,配置以及生命周期管理都在这个模块中,属于阎王爷的生死簿级别。控制反转思想的实现也正是基于这个核心模块实现的,而且是面试必问的,必问!必问!
  4. Test层,这里提供单元测试,Mock测试等功能,目的是方便使用Spring框架的开发人员能够更轻松的写单元测试。

核心思想概述

IOC

英文名:Inversion Of Control

中文名:控制反转

主要技能:对象间解耦合,不用关心对象的创建,配置以及生命周期的管理,一切都交给框架管理。这里就反映了Spring的设计思想,灵活运用了工厂模式,单例模式以及原型模式等等

下面分别用两张图对比展示IOC思想带来的好处:

2y2Unab.png!mobile

AN7zEn6.png!mobile

第一张图展示了在非IOC容器中传统的通过new关键字创建对象并实现对象间关联,这种方式在比较大的项目中,一个类A可能要被几十上百个类引用,如果这个类A中的业务发生变化,那么后果就是牵一发动全身,代码的可维护性和扩展性大大降低。

第二张图在IOC容器的支持下,Java对象的管理方式得到了本质上的改变,所有对象都交给IOC容器统一管理,统一分配,统一管理(这么说太绝对了,因为当Bean的Scope属性为prototype时,对象创建后就不由IOC容器控制了,可以暂且这么理解,后边会详细说明),某个类依赖的对象直接由IOC容器包分配。

IOC容器的创建,还引入了另外一个概念,叫DI--Dependancy Injection即常说的依赖注入。也是一个概念性的东西,用来描述IOC容器中Bean对象之间关系的。打个比方,一大堆单身男女(各种Class的Bean对象)想在今天这个平安夜脱单,并且带着自己的择偶标准(依赖的其他对象),于是找到了某交友APP就叫IOC,那么IOC有了这些人(Bean)的信息以后,就可以按需(依赖)分配了。这个分配过程就是依赖注入--DI。那如果张三指明说喜欢李四,李四喜欢王五,而王五却喜欢张三,这就是循环依赖。Spring的解决办法是利用三级缓存,细节部分会在后面的文章中阐述。

AOP

英文名:Aspect Oriented Programming

中文名:面向方便面编程

主要技能:可以将模板化的,通过OOP无法解决的逻辑代码提取出来,比如说统计一个方法执行耗时,需要在方法入口和出口分别打印并计算耗时,或者是创建事务,进入方法时创建事务,方法结束时提交或者回滚事务(这个Spring基于AOP已经实现了声明式事务),再或者是访问权限控制等等。这类代码是无法通过提取父类来完成的。我个人理解,AOP弥补了Java原生OOP的不足之处。

假设有个婚介所叫AOP,单身男女都想找对象而且都对身高有严格要求,在没有AOP婚介所的时候,所有单身男女都要在相亲角拿着尺子互量身高,符合条件才能处对象,那量身高这个动作本身是跟相亲这个业务是无关的,而且有很多人都要量,那么AOP婚介所来了,同时提供了量身高的服务,只要张三找的对象是经过AOP婚介所对的,那么就是符合张三要求的,这样就把所有人(Bean)的公共的非业务需求利用AOP思想提取出来了,方便维护和重用。

而AOP的实现又是基于代理,代理又分为静态代理和动态代理,动态代理也有两种方式:JDK提供的面向接口代理的Proxy代理类和CGlib动态代理,在Spring中当使用AOP进行横切时,如果目标类的上层有接口,默认会采用JDK代理技术,反之使用CGlib代理,也能够在XML配置或者注解中强制使用CGlib进行代理。CGLib底层采用ASM字节码生成框架,并在字节码层生成被代理对象的子类,有兴趣的同学可以研究一下Java字节码生成开源框架Javassist和ASM,以及Javaagent,用于构建独立于应用程序的代理程序,常见的热部署工具Jrebel就是基于这一原理实现的。都是很牛X的技术,后边可能会写,不关注一波可就亏大了。

总结

Spring太哇塞了!下一篇会用代码的形式实现“IOC交友APP”

和“AOP婚介所”用尽可能俗的文字和代码说明白为什么需要IOC(卧龙)和AOP(凤雏),他俩到底解决了什么问题!!

点赞关注不迷路,再次感谢!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK