大家都说“不要重复发明轮子”, 那是没有意义的,确实是这样。 但是我们可以再造一遍, 在造的过程中来学习别人优秀的设计和优雅的代码。
那为什么要造Spring的轮子?
很简单, Spring 几乎就是Java 后端开发的代名词,统治了十几年,人家还在与时俱进,如果没有意外, 估计还要继续统治下去,这样的软件和系统,绝对值得Java 后端程序员投资,深入学习。
到底怎么造?
这个问题一度让我非常纠结。
我已经把Spring 核心的IoC和AOP看了一遍,说实话,很痛苦。 难道带着大家去通读源码,然后再仿照着写?
可是Spring实在是太庞大了,仅仅是核心IoC和AOP代码,即使是早期版本,依然是一篇黑暗森林: 每个阅读源码的程序员都像一个带枪的猎人,小心翼翼地在丛林中穿行,一不小心就......
如果这么做,大家很有可能陷入Spring细节的枝枝蔓蔓中, 会从入门到放弃。
还有一种办法,那就是写个极简版本,几百行代码就把最最核心的东西实现了。这样的代码网上也不少, 但是似乎和学习Spring的目的不符啊!
我们学习Spring到底学习什么?
我想主要是看人家是怎么设计的,对于一些概念是怎么抽象的,代码是怎么组织的...... 基于这个前提,带着大家再去读源码是一件低效率的事情,不能这么做!
后来我想到了一个办法: 从零开始,一步步逼近Spring 。
从最简单的结构(也就是基于XML的BeanFactory,只有缺省构造函数的Bean)开始,一步步扩展到setter注入, 有参数的构造函数,注解,auto-scan , 用cglib实现AOP,用java动态代理实现AOP......
在这个过程中,不能天马行空地写代码,脑海中始终有一根弦:一定要时刻注意着和Spring 的核心思想,核心类保持一致,具体的做法就是:不断地重构。
这样以来,我们最终的代码会和Spring的核心类非常类似,只是去掉了一些处理各种各样异常情况的枝枝蔓蔓, Spring的主干会得以保留,即逼近Spring,而不是Copy Spring。
在实现的过程中,你会看到Spring为什么是这么设计的,为什么要做出Resource, BeanDefinitionRegistry,InjectedElement,BeanPostProcessor......这样的抽象。 换句话说,我们要理解why, 而不仅仅是How。 我觉得这也是造Spring轮子的最大价值所在。
特别值得一提的是,我会采用测试驱动(TDD)的方案,完全站在使用者的角度,用测试先行的方式驱动出所有的代码。对单元测试和重构不熟悉的同学,可以看看是怎么完成TDD这个过程的,TDD是如何和设计结合的。
总之,利用这种从零开始,一步步逼近Spring的办法,相当于重现了Spring框架的诞生过程(当然具体的思路和原作者不一定相同)既使得造轮子过程不那么枯燥,又能理解Spring源码的核心思想。
我希望生成的代码“简约而不简单”,既能体现Spring的设计思想,又不会过分复杂。
为什么没有SpringMVC?
我发现,仅仅是逼近Spring 的IoC和AOP的核心功能,就已经非常复杂了。
考虑到SpringMVC更为复杂,尤其是和Web相关的,很多细节的处理代码,这次还是放弃。
课程大纲:
第一章 Spring概述:
1-1 Spring-课程介绍
1-2 Spring-Spring优势
1-3 Spring-概念和作用
1-4 Spring-注册功能的实现
1-5 Spring-给依赖对象重新赋值
1-6 Spring-给依赖对象重新赋值2
1-7 Spring-配置文件编写
1-8 Spring-反射创建对象
1-9 Spring-反射给属性赋值
1-10 Spring-自定义spring容器总结
1-11 Spring-体系结构
1-12 Spring-框架的主页介绍
第二章 IoC 控制反转:
2-1 Spring-IoC概念
2-2 Spring-第一个spring项目开发步骤
2-3 Spring-定义业务接口SomeService
2-4 Spring-约束文件的使用
2-5 Spring-无网络配置约束文件
2-6 Spring-使用bean标签声明对象
2-7 Spring-创建Spring的容器对象-ClassPathXmlApplicationContext
2-8 Spring-配置文件放在磁盘目录中-创建容器对象
2-9 Spring-配置文件放在项目根目录下-创建容器对象
2-10 Spring-容器中对象的创建时间
2-11 Spring-获取容器内部的信息
2-12 Spring-适合spring管理的对象
2-13 Spring-bean的默认创建方式-无参数构造方法
2-14 Spring-单例作用域
2-15 Spring-原型作用域
2-16 Spring-bean的生命始末方法
2-16 Spring-bean的生命始末方法
2-17 Spring-bean装配的总结
2-18 Spring-DI的分类介绍
2-19 Spring-DI的实现方式
2-20 Spring-简单类型的设值注入
2-21 Spring-设值注入的注意事项
2-22 Spring-引用类型的设值注入-准备
2-23 Spring-引用类型的设值注入
2-24 Spring-构造注入
2-25 Spring-构造注入省略index属性
2-26 Spring-集合性质的属性注入
2-27 Spring-复杂集合类型的属性注入
2-28 Spring4-自动注入byName
2-29 Spring4-自动注入byType
2-30 Spring4-多配置文件的使用方式
2-31 Spring4-平等关系的配置文件
2-32 Spring4-包含关系的配置文件
2-33 Spring4-使用注解的准备工作
2-34 Spring4-Compoent创建对象的基本用法
2-35 Spring4-创建对象的其他注解
2-36 Spring4-指定多个扫描包的三种方式
2-37 Spring4-value简单类型的赋值
2-38 Spring4-Autowired引用类型byType
2-39 Spring4-Autowired引用类型byName
2-40 Spring4-Autowired的属性required默认是true
2-41 Spring4-Resource注解的默认byName
2-42 Spring4-Resouce只使用byName
2-43 Spring4-bean的生命始末注解
2-44 Spring4-xml和注解的对比
第三章 AOP 面向切面编程:
3-1 Spring4-两种动态代理的实现方式
3-2 Spring4-jdk动态代理的实现1
3-3 Spring4-jdk动态代理实现2
3-4 Spring4-cglib动态代理实现1
3-5 Spring4-cglib动态代理实现2
3-6 Spring4-Aop的引入1
3-7 Spring4-Aop的引入-动态代理2
3-8 Spring4-Aop的引入-动态代理-控制方法3
3-9 Spring4-Aop基于动态代理
3-10 Spring4-Aop的概念
3-11 Spring4-AspectJ框架的介绍
3-12 Spring4-切入点表达式1
3-13 Spring4-切入点表达式2
3-14 Spring4-切入点表达式3
3-15 Spring4-AspectJ使用前准备
3-16 Spring4-AspectJ-前置通知-切面类定义
3-17 Spring4-AspectJ-前置通知-spring配置文件
3-18 Spring4-AspectJ-前置通知-执行流程
3-19 Spring4-AspectJ-前置通知-切入点表达式的灵活用法
3-20 Spring4-通知方法的参数JoinPoint
3-21 Spring4-AspectJ-后置通知实现
3-22 Spring4-AspectJ-后置通知-目标方法返回基本类型
3-23 Spring4-AspectJ-后置通知-JoinPoint必须是第一个参数
3-24 Spring4-AspectJ-后置通知-通知方法返回对象类型
3-25 Spring4-AspectJ-环绕通知实现
3-26 Spring4-AspectJ-环绕通知-控制访问
3-27 Spring4-AspectJ-异常通知实现
3-28 Spring4-AspectJ-最终通知实现
3-29 Spring4-AspectJ-定义切入点的通知Pointcut
3-30 Spring4-AspectJ-没有接口的目标类使用cglib
3-31 Spring4-AspectJ-有接口目标类强制使用cglib
第四章 Spring集成MyBatis:
4-1 Spring4-Druid连接池的介绍
4-2 Spring4-mybatis和spring整合的思路步骤
4-3 Spring4-mysql中建立表student
4-4 Spring4-导入jar
4-5 Spring4-定义Dao接口和sql映射文件
4-6 Spring4-定义Service接口和实现类
4-7 Spring4-mybatis主配置文件
4-8 Spring4-声明数据源和SqlSessionFactory
4-9 Spring4-声明MyBatis的扫描器
4-10 Spring4-声明Service对象
4-11 Spring4-测试Service方法
4-12 Spring4-使用属性配置文件
4-13 Spring4-声明dbcp数据库连接池
第五章 Spring与Web:
5-1 Spring4-创建web项目定义Servlet
5-2 Spring4-结果页面jsp
5-3 Spring4-注册Servlet对象
5-4 Spring4-web中使用spring的问题
5-5 Spring4-修改.settings下面的资源文件
5-6 Spring4-使用框架提供的监听器的步骤
5-7 Spring4-监听器加载spring配置文件
5-8 Spring4-Servlet中使用容器对象
5-9 Spring4-监听器源代码分析
神之杰作-Spring
来源:知乎
原文:https://zhuanlan.zhihu.com/p/63287648