Giter Club home page Giter Club logo

book-small-spring's Introduction

《手写Spring:渐进式源码实践》 —— 书籍源码库

本项目思路和代码来自于开源项目 DerekYRC/mini-springcode4craft/tiny-spring 经过本人学习、扩展、补充,并编写文章总结经验,分享给广大读者,一起学习 Spring 源码。非常感谢开源项目贡献者,读者也可以一起学习,不同视角下的学习经验。

开源项目及优秀书籍


👨‍💻作者:小傅哥
🌱微信:fustack —— 可以添加微信备注【Spring读书群📚】

沉淀、分享、成长,让自己和他人都能有所收获!

IOCAOPSPI,Spring 给你的不只是一个开发框架,还包括它的设计**。它通过解耦 Bean 对象的实例化过程,管理 Bean 的生命周期,来维护你在程序开发中所需对象使用过程。让你不需要刀耕火种般 new 一个对象,也不需要如 EJB 一样笨重臃肿的开发维护,而像春风一样润物(万物皆可Bean)细无声的使用。因此可以说它完全担得起 Java 技术设计的顶峰


除了运用以外,Spring 框架也是众多码农,最能最先接触到的一个源码级复杂项目。任何初出新手村蜕变的码农,寻觅苦找的锻炼项目,都不如学习 Spring 源码来的痛快。从架构设计的复杂、从分治抽象的运用、从设计模式的驾驭,Spring 框架都是顶级的,也是最能给你带来丰富收获的。


📝目录

  1. 代码仓库
  2. 本书特点
  3. 学以致用
  4. 书籍购买
  5. 勘误记录 —— 非常感谢,读者提交阅读中发现的错字和问题。

1. 本书特点

  1. 这本书最大的价值是带着想学Spring源码的读者,能有个门进去。避免像以前一样,东一榔头西一棒子没有体系化的学。
  2. 手写spring,不是为了再造一个轮子,是为了吸收更好的架构设计和编程**。并把内容运用到实际项目,既可以解决业务的耦合实现,提升交付质量。
  3. 本书采用从零手写 Spring 的方式,摒弃 Spring 源码中繁杂的内容,选择整体框架中的核心逻辑,简化代码实现过程,保留核心功能,如 IOC、AOP、Bean 的生命周期、上下文、 作用域和资源处理、事务等。在开发过程中,细化功能模块,逐步完成一个简单版的 Spring 框架。

2. 学以致用

《手写Spring:渐进式源码实践》完成后我的能力如何体现在简历上?给个案例。

  1. 体现在专业技能上,例如;

    1. 深入学习 Spring 核心流程模块,包括;IOC、AOP、依赖倒置等流程,掌握Spring解决复杂场景所运用的分治、抽象和知识(设计模式、设计原则),在解决Spring场景问题时,可以从核心原理上给出方案。同时也具备基于 Spring 开发 SpringBoot Starter 技能,为复杂项目减少同类共性需求的开发,凝练通用的技术组件,减少研发成本。
    2. 深入学习 MyBaits 核心流程模块,包括;会话、反射、代理、事务、插件等流程,熟练掌握 ORM 框架的设计**、实现方式和应用价值。并能按需结合 MyBatis 的插件机制,开发属于企业自己所需的功能,包括;数据分页、数据库表路由、监控日志、数据安全等方面。
  2. 体现在项目经验上,例如;—— 对校招和实习比较有用 把 Spring、MyBatis 当一个学习项目来描述,这是你在离校前,最可能接触到的一个完整的、成型的、知名的,有企业使用的,框架。你就按照自己学习并开发了这样一个框架为目标来写项目,并描述出这个项目,你用了什么技术栈,解决了什么问题,学习到了哪些。

  3. 体现在项目应用上,例如; 关于 Spring、MyBatis 的项目,一般都是插件类开发,比如各类的 SpringBoot Starter,MyBatis 插件,都是基于框架的深入整合类技术解决方案,体现在简历上,非常抓眼球。一看你就是有深度和自研能力的研发人员。—— 一般不让你造轮子,但需要你有造轮子的能力,这样企业中一些软件可以被你进行优化和修改。

  4. 体现在解决问题上,例如; 在你的自己的业务项目中,渗入一些关于解决了原项目使用 Spring 时,关于感知 Aware 方式或者结合 FactoryBean 包装对象等,所遇到的问题,因为你学习过源码,所以非常清晰这样的流程,因此解决了一个问题。通用 MyBatis 也适用于这样的描述方式,包括;事务、查询次数、批查询、插件能监听到的四个类(ParameterHandler、ResultSetHandler、StatementHandler、Executor )你给了更好的选择。

3. 书籍购买

链接下单https://u.jd.com/4LapTH4

本书共21章;

  • 第01 ~ 10章:主要介绍IOC 容器,逐步完善一个简单的Spring Bean 容器的相关功能,引入实例化策略、注入属性和依赖、设计应用上下文、处理Bean 对象的生命周期,以及实现感知容器对象的监听等。
  • 第11 ~ 12章:主要介绍AOP 切面,基于JDK、Cglib 的动态代理、方法拦截、切点表达式等技术,将代理与Spring Bean 容器整合,提供AOP 切面功能。
  • 第13 ~ 17章:扩展简单版Spring 框架的自动化功能,完成自动扫描注册、注解和代理注入,以及通过三级缓存处理对象的循环依赖等功能。
  • 第18 ~ 21章:基于简单实现的Spring 框架整合JDBC、事务的功能,开发一个简单版的ORM 框架,并将ORM 框架整合到Spring Bean 容器中,介绍自定义代理对象的扫描和注册过程。

本书主要通过渐进式开发功能模块,以实现开发整个Spring 框架的核心源码。首先,每章开头都会列出难度和重点;然后,正文中会介绍要处理的问题、具体设计和实现代码;最后,给出测试验证和本章总结。

4. 勘误记录

1. 第3页,Spring 框架地图

  • 错误:BeanPostProcessor 前置处理 | postProcessAfterInitializtion
  • 修改:BeanPostProcessor 后置处理 | postProcessAfterInitializtion

2. 第17页,图 2-2 类图错误

  • 错误:图 2-2 DefaultSingletonBeanRegistry #addSingleton 类图与代码不符
  • 修改:图 2-2 DefaultSingletonBeanRegistry #registerSingleton

3. 第5页,工程示意图调整

  • 错误:SpringTutorials
  • 修改:book-small-spring
  • 说明:因为作者github中项目较多,所以统一修改了工程名称,方便读者知道book开头的是项目工程是图书库代码。

4. 第27页,工程结构,颜色标记 感谢 反馈人:@苏沐

  • 错误:DefaultListableBeanFactory 绿色标记
  • 修改:DefaultListableBeanFactory 黑色标记
  • 说明:绿色为新增,DefaultListableBeanFactory 非新增类,为黑色。

5. 第52页,图 5-4 感谢 反馈人:@水中捞月、@INIT

  • 错误:BeanFactory 多了一个 registerBeanDefinition 方法
  • 修改:删除掉 registerBeanDefinition 方法,并在 BeanFactory 标记《接口》

6. 第167页,图 12-1 感谢 反馈人:@🍇葡萄

  • 错误:图中 ProxyFacory 单词错误
  • 修改:ProxyFacory 修改为 ProxyFactory

book-small-spring's People

Contributors

fuzhengwei avatar meta-repo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

book-small-spring's Issues

invokeInitMethods中缺少二次初始化的判断

AbstractAutowireCapableBeanFactory类中的invokeInitMethods函数应该像适配器的destroy函数一样,提供同时实现接口DisposableBean和添加至xml配置文件destroy-method时的判断。

参考适配器DisposableBeanAdapter的源码,是否应该将invokeInitMethods中的if条件修改如下?
if (StrUtil.isNotEmpty(initMethodName) && !(bean instanceof InitializingBean && "afterPropertiesSet".equals(initMethodName)))

书P92的注释不正确,为了避免二次销毁 应改为 为了避免二次初始化,但源码看起来已经更正了。

勘误

40页 top的code里面get/set 应该只有get,属性都是final修饰的

bean属性重复赋值问题

com.vow.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator#postProcessPropertyValues的方法是不是应该返回null,com.vow.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean在执行到applyBeanPostProcessorsBeforeApplyingPropertyValues(beanName, bean, beanDefinition);的时候会将InstantiationAwareBeanPostProcessor实现类返回的属性重复add到BeanDefinition#propertyValues属性列表中(beanDefinition.getPropertyValues().addPropertyValue(propertyValue);),会重复赋值

勘误

P164代码贴图不对

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.