Spring的回炉重造

大家都说“不要重复发明轮子”, 那是没有意义的,确实是这样。 但是我们可以再造一遍, 在造的过程中来学习别人优秀的设计和优雅的代码。

那为什么要造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

你可能感兴趣的:(Java学习资料)