交个朋友

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

我的想法是这样的,接下来的一段时间专门写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的架构:

自上而下可以分为四层:

  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思想带来的好处:

第一张图展示了在非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(凤雏),他俩到底解决了什么问题!!

更多文章请微信搜索Java栈点公众号!

你好,Spring!的更多相关文章

  1. Spring mvc系列一之 Spring mvc简单配置

    Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...

  2. Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】

    源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...

  3. 【学习】Spring 的 AOP :基于Annotation 的“零配置”方式

    转自:http://www.cnblogs.com/jbelial/archive/2012/07/20/2539123.html AOP(Aspect Orient Programming ) , ...

  4. 精益求精!Spring Boot 知识点全面回顾,带你重新细读源码!

    约定优于配置 Build Anything with Spring Boot:Spring Boot is the starting point for building all Spring-bas ...

  5. simple go web application & 二维码生成 & 打包部署

    go语言简易web应用 & 二维码生成及解码 & 打包部署 转载请注明出处: https://www.cnblogs.com/funnyzpc/p/10801476.html 前言(闲 ...

  6. 玩转spring boot——快速开始

    开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...

  7. spring boot1

    spring boot 玩转spring boot--快速开始   开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv ...

  8. MongoDB分组汇总操作,及Spring data mongo的实现

    转载请在页首注明作者与出处 一:分组汇总 1.1:SQL样例 分组汇总的应用场景非常多,比如查询每个班级的总分是多少,如果用关系形数据库,那么sql是这样子的 ),class from score g ...

  9. Spring学习系列(一) Spring简介

    Spring简介 之前一直想写点东西,可一直没有开始实施,各种原因都有,最大原因可能还是自己太懒了,嘿嘿.最近在看Spring in action这本书,为了能让自己坚持下去把书看完,这次决定同步的在 ...

随机推荐

  1. k8s+docker_part2

    docker+k8s 目录 docker+k8s 1 简介 1.1 docker是什么 1.2 为什么要用docker 1.2.1 docker容器虚拟化的好处 1.2.2 docker在开发和运维中 ...

  2. 数据库事务ACID/隔离级别

    参考博客 1. 事务的定义 事务是用户定义的一个数据库操作序列.这些操作要么全执行,要么全不执行,是一个不可分割的工作单元.在关系型数据库中,事务可以是一条SQL语句,也可以是一组SQL语句或整个程序 ...

  3. moviepy音视频剪辑:TextClip.list(font)和search搜索字体报错UnicodeDecodeError:utf-8 codec cannott decode byte 问题

    ☞ ░ 前往老猿Python博文目录 ░ 在moviepy2.0.0.Dev版本中,执行如下语句: from moviepy.editor import * TextClip.search('gb', ...

  4. 转:python提取浏览器Cookie

    在用浏览器进行网页访问时,会向网页所在的服务器发送http协议的GET或者POST等请求,在请求中除了指定所请求的方法以及URI之外,后面还跟随着一段Request Header.Request He ...

  5. 【JAVA并发第一篇】Java的进程与线程

    1.进程与线程 1.1.进程 进程可以看作是程序的执行过程.一个程序的运行需要CPU时间.内存空间.文件以及I/O等资源.操作系统就是以进程为单位来分配这些资源的,所以说进程是分配资源的基本单位. ( ...

  6. Vue 的父组件和子组件生命周期钩子执行顺序是什么

    加载渲染过程父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount-&g ...

  7. centos7.5以上poenssl和openssh升级

    2020年12月09日,360CERT监测发现  openssl  发布了  openssl 拒绝服务漏洞  的风险通告,该漏洞编号为  CVE-2020-1971  ,漏洞等级:高危 ,漏洞评分:7 ...

  8. Codeforces Round #682 Div2 简要题解

    Contest link A.Specific Tastes of Andre Problem link 题意 构造一个长度为 \(n\) 的序列,使得每个非空子序列的和都被其长度整除. 思路 直接每 ...

  9. CF1000F One Occurrence

    本题解用于记录一下一个优秀的东西--懒标记. 题解 可以很轻易的想到莫队的做法,但是题目让你输出的是满足条件的一个数,而不是满足条件的数的个数,似乎很难去 \(O(1)\) 转移.这个时候我们的懒标记 ...

  10. 【学习笔记】K-D tree 区域查询时间复杂度简易证明

    查询算法的流程 如果查询与当前结点的区域无交集,直接跳出. 如果查询将当前结点的区域包含,直接跳出并上传答案. 有交集但不包含,继续递归求解. K-D Tree 如何划分区域 可以借助下文图片理解. ...