学习Spring的思考框架
引子
很早之前听同事说:“要开会了。我都知道领导要问什么,就那几板斧。”其实领导之所以为领导,人家问的问题确实很合情合理,甚至可以说一针见血。而之所以能问出来这些合理的问题,就是因为头脑中有自己的思考框架。比如要做一件事情,一个思考框架就是:
1,我们现在是什么样的?
2,我们要做成什么样(解决什么问题、有什么收益)?
3,怎么才能达成(解决路径)?
根据这个思考框架,开会的时候,给领导做汇报,一上来就说我做了什么什么。领导自然要问:“做这件事情有什么收益?” 如果一项任务指标特别好,领导就要问了:“那我们是怎么做到的呢?”
这种框架式自上而下的思考习惯,对做任何事情都会有帮助。比如想学习Spring,就先问自己3个问题:
1,出现Spring之前是什么样子?
2,Spring的目标是什么?
3,Spring是怎么做到的呢?
出现Spring之前是什么样子
出现Spring之前,MVC这种设计典范已经开始兴起。在显示层、模型层和控制层都有了一些工具的支持。比如显示层有JQuery+JSON,模型层有ibatis,控制层有Struts。开发人员的主要精力应该放到业务逻辑的开发。但是开发前需要做一件事情:将MVC需要的这些东西组装起来。每个人在新搭建一个工程时都需要进行组装。那有没有一个东西把开发人员需要的东西都弄好了,开发人员只需要将精力用户业务逻辑开发呢?Spring就是为了解决这个问题而生。
Spring的目标是什么
Spring就是要最大限度的简化开发工作,让开发人员集中精力于自己的业务逻辑,也是DDD领域驱动开发。
Spring是怎么做到的呢
核心问题解决
1,解耦
开发人员希望聚焦DDD的开发,首先要解决的事情是我修改一个业务代码,不希望显示层、模型层和控制层都要改。不希望改一个类,依赖它的类也需要改。Spring为了应对这个问题使用了控制反转的理念。将所有的依赖都由框架注入到一个上下文环境中(DI)。在这个环境中,Bean之间可以自由的使用。
2,复用
有了DI(依赖注入)的支持,开发人员可以具体聚焦DDD的开发了。一个优秀程序员的最大的美德是懒惰。一些逻辑,比如日志,鉴权,很多地方都需要用到。这个业务逻辑关系又不是很紧密,代码基本上就是拷贝一下。那怎么能将这些业务特点不强的逻辑从开发人员的工作中剔除掉呢?这就用到了AOP(面向切面)编程。以上Spring要解决的核心问题解耦和复用的解决方案就是Spring的核心:控制反转、依赖注入和AOP。
核心功能实现
为了将Spring的核心功能实现出来,就需要用到Robert Martin提出的SOLID原则。分别是单一职责、开放封闭、里氏替换、接口隔离和依赖倒置。控制反转、依赖注入和AOP,分别对应了三个spring的jar包:spring-beans、spring-context、spring-aop。每个包单一的负责一个核心功能的实现。这些都需要先做对象的实例化,这个功能由spring-core这个jar包来实现。在Spring-beans中,Spring使用工厂模式来管理程序中使用的对象Bean。每个Bean实例以BeanDefinition的形式被创建,通过java的反射机制将需要初始化的字段写入,最终保存在BeanDefinitionMap中。这整个过程由容器来实现,完成了控制反转。有了控制反转,开发者可以通过调用getBean获取到所需要的对象。spring-context提供文件列表的读入,将所有依赖的Bean放到一个Context中,就是常说的依赖注入。AOP的主要作用是不通过修改源代码的方式将功能代码织入来实现对方法的增强。实现的关键在于使用了代理模式。代理主要分为静态代理和动态代理。静态代理最简单的实现就是创建一个代理类,将对象new出来之后,在调用方法前后都加上代码。调用方调用代理类而不直接调用原始类。动态代理主要是JDK动态代理和Cglib动态代理,这里就不详细展开了。
总结
本文从技术上,只介绍了Spring框架部分的核心功能。大家可以按照这个思路继续将其他部分纳入体系。当然,本文用的思考框架也只是思考框架的一种,是偏产品化的一个视角。完全可以用偏技术化的视角比如:「是什么、为什么、怎么办」的思考框架,只要保持一个风格、梳理成体系就好。以上Spring相关的部分,用一张图总结如下

温故知新
专治不会看源码的毛病--spring源码解析AOP篇(2017版)
学习Spring的思考框架的更多相关文章
- MongoDB学习-->Spring Data Mongodb框架之Repository
application-dev.yml server: port: 8888 mongo: host: localhost port: 27017 timeout: 60000 db: mamabik ...
- 【快学SpringBoot】快速上手好用方便的Spring Cache缓存框架
前言 缓存,在开发中是非常常用的.在高并发系统中,如果没有缓存,纯靠数据库来扛,那么数据库压力会非常大,搞不好还会出现宕机的情况.本篇文章,将会带大家学习Spring Cache缓存框架. 原创声明 ...
- 跟着刚哥学习Spring框架--创建HelloWorld项目(一)
1.Spring框架简介 Spring是一个开源框架,Spring是在2003年兴起的一个轻量级的开源框架,由Rod johnson创建.主要对JavaBean的生命周期进行管理的轻量级框架,Spri ...
- 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置
在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...
- Spring MVC 学习总结(十)——Spring+Spring MVC+MyBatis框架集成(IntelliJ IDEA SSM集成)
与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...
- 跟着刚哥学习Spring框架--AOP(五)
AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入 ...
- 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)
组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...
- 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)
Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式 √ id:标识容器中的bean.id唯一. √ cl ...
- 跟着刚哥学习Spring框架--Spring容器(二)
Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用. Bean是S ...
随机推荐
- Dart函数、类和运算符-处理信息
编程语言虽然千差万别,但归根结底,它们的设计思想无非就是回答两个问题: 1.如何表示信息: 2.如何处理信息: 函数 函数是一段用来独立地完成某个功能的代码.函数是对象类型,它的类型叫做Functio ...
- SpringCloud-Hystrix Dashboard 之 Unable to connect to Command Metric Stream
实践hystrix dashboard仪表盘的时候,不管是按照书上的还是网上的,都提示Unable to connect to Command Metric Stream. 查了好久发现,如果使用sp ...
- Gitlab+Gitlab-CI+Docker实现持续集成(CI)与持续部署(CD)
写在前面 记录一下,一个自动化开发部署项目的构建过程与简单使用,实现真正的DevOps gitlab安装 步骤一:安装依赖 yum -y install git gcc glibc-static te ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(协程池版)
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from gevent import monkey monkey.patch_all() from gevent.pool i ...
- IDEA 学习笔记之 Spark/SBT项目开发
Spark/SBT项目开发: 下载Scala SDK 下载SBT 配置IDEA SBT:(如果不配置,就会重新下载SBT, 非常慢,因为以前我已经下过了,所以要配置为过去使用的SBT) 新建立SBT项 ...
- git checkout 提示 “error: The following untracked working tree files would be overwritten by checkout” 解决
问题描述 Windows 或者 macOS 操作系统中,文件名是不区分大小写的.对于已经提交到仓库中的文件修改文件名的大小写,然后又用 git rm 命令将老文件从 Git 仓库删除掉,并保存下新的文 ...
- reduce方法应用技巧
定义和用法 reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值. 注意: reduce() 对于空数组是不会执行回调函数的. 浏览器支持 方法 Chro ...
- k8s运维记 - 如何让部署到k8s的kong网关托管自定义静态资源?
目的 使用kong作为目录/data/reports的静态资源服务器,为了测试,已于目录/data/reports下创建文件report.html,如下: <html> <head& ...
- 微人事 star 数超 10k,如何打造一个 star 数超 10k 的开源项目
看了下,微人事(https://github.com/lenve/vhr)项目 star 数超 10k 啦,松哥第一个 star 数过万的开源项目就这样诞生了. 两年前差不多就是现在这个时候,松哥所在 ...
- Kafka安装-Linux版
1. 准备 1.1 Kafka Kafka版本采用0.10.2.1,下载0.10.2.1文件 http://kafka.apache.org/downloads 1.2 JDK JDK ...