

作者:开课吧醉寒
图文编辑:开三金
认识Spring
spring作为java开源世界的第一框架,Spring已经成为事实上的Java EE开发标准,Spring框架最根本的使命是简化Java开发,提高工作效率,开发者基本上只需要关注业务实现。
学习、研究、掌握Spring框架成为每一位Java开发人员的必备知识体系。
而阅读源码则是学习Spring的最好方式之一,阅读源码可以很好的学习到作者的优秀代码,以及开发者设计的思想,回想一下让自己这样设计能有这样的想法?

学习spring源码必要掌握的内功
架构的设计的七大设计原则
1.开闭原则
2.依赖倒置原则
3.单一职责原则
4.接口隔离原则
5.迪米特原则
6.里式替换原则
7.合成复用原则
学习设计原则可以帮我们写出更优雅的代码结构,再实际开发中很少会遵循设计原则,主要是考虑的因素太多,不能刻意追求完美。

Spring中的设计模式有那些
1.工厂模式:只对结果负责
2.单例模式:保证自己是独一无二的
3.原型模式:一生万物
4.代理模式:找人办事
5.委派模式:包产到户,只关注结果
6.策略模式:过程不同,结果一样
7.模板模式:按规矩办事,可以有变通
8.适配器模式:兼容
9.装饰者模式:包装
10.观察者模式:你不动我不动,牵一发动全身。
以上是spring框架中常用的设计模式,掌握这些设计模式可以很好的写出看着另人舒服的代码。

Spring的设计初衷
为程序开发者提供一个一站式、轻量级的开发平台,这个平台不仅可以降低代码的开发难度、降低代码之间的耦合度还可以与第三方中间件更好、更便捷的结合。
通过IOC容器来管理POJO对象;通过依赖注入和面向接口松耦合;通过AOP,以动态、非侵入的方式来增强服务的功能。
IOC和AOP是Spring的核心部分,是最为底层的抽象。
而他主要是通过:
面向 Bean(BOP)、依赖注入(DI)以及面向切面(AOP)这三种方式来达成的。
BOP
Spring 是面向 Bean 的编程(Bean Oriented Programming, BOP),Bean 在 Spring 中才是真正的 主角。
Bean 在 Spring 中作用就像 Object 对 OOP 的意义一样,Spring 中没有 Bean 也就没有 Spring 存在的意义。
Spring 提供了 IOC 容器通过配置文件或者注解的方式来管理对象之间的依赖关系。
依赖注入
Spring 设计的核心:
org.springframework.beans 包(架构核心是 org.springframework.core 包),它的设计目标是与 JavaBean 组件一起使用。
这个包通常不是由用户直接使用,而是由服务器将 其用作其他多数功能的底层中介。
基础 BeanFactory 接口,它是工厂设计模式的实现, 允许通过名称创建和检索对象。
BeanFactory 也可以管理对象之间的关系。BeanFactory 最底层支持两个对象模型。
单例:提供了具有特定名称的全局共享实例对象,可以在查询时对其进行检索。
Singleton 是默 认的也是最常用的对象模型。
原型:
确保每次检索都会创建单独的实例对象。
在每个用户都需要自己的对象时,采用原型模式。
Bean 工厂的概念是 Spring 作为 IOC 容器的基础。
IOC 则将处理事情的责任从应用程序代码转移到 框架。
面向切面
Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。
应用对象只实现它们应该做的——完成业务逻辑——仅此而已。
它们并不负责其它的系统级关注点,例如日志或事务支持。
Spring架构

Spring数据访问和集成模块:
主要实现了包括Spring支持各种ORM框架,如JDBC Template、JPA、mybatis等的集成;
还包括了Spring集成Marshalling XML的处理模块;
以及对Spring包括声明式与编程式事务的支持。
Spring-Web模块:
主要实现了Spring对Web的支持,如SpringMvc、Webservice等的支持。
AOP和设备支持:
由spring-aop、spring-aspects和spring-instrument3个模块组成;
spring-aop是Spring的另一个核心模块,是AOP主要的实现模块。
作为继OOP后,对程序员影响最大 的编程思想之一,AOP极大地开拓了人们对于编程的思路。
在Spring中,他是以JVM的动态代理技术为 基础,然后设计出了一系列的AOP横切实现,比如前置通知、返回通知、异常通知等;
同时,Pointcut 接口来匹配切入点,可以使用现有的切入点来设计横切面,也可以扩展相关方法根据需求进行切入。
spring-aspects模块集成自AspectJ框架,主要是为SpringAOP提供多种AOP实现方法。
spring-instrument模块是基于JAVASE中的"java.lang.instrument"进行设计的;
应该算是AOP的一个支援模块,主要作用是在JVM启用时,生成一个代理类,程序员通过代理类在运行时修改类的字节,从而改变一个类的功能,实现AOP的功能。
在分类里,我把他分在了AOP模块下,在Spring官方文 档里对这个地方也有点含糊不清,这里是纯个人观点。
Spring核心模块:
主要组件是BeanFactory,创建JavaBean的工厂,使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
spring-messaging模块:
spring-messaging是从Spring4开始新加入的一个模块,主要职责是为Spring框架集成一些基础的报 文传送应用。

在springbean容器当中 xmlbeanFactory继承自DefaultListableBeanFactory
而DefaultListableBeanFactory是整个bean加载的核心部分;
是spring加载并注册bean的默认实现 XmlBeanFactory中使用了自定义的XmlBeanDefinationReader 实现了个性化的BeanDefinationReader的读取;
类图中 DefaultListableBeanFactory 继承了AbstractAutowireCapableBeanFactory 并实现了ConfigurableListableBeanFactory 以及BeanDefinationRegistry接口
BeanFactory:
定义获取bean及bean的各种属性
SingletonBeanRegistry:
定义对单例的注册和获取
DefaultSingletonBeanRegistry (DSBR):
对接口SingletonBeanRegistry各种方法的实现
HierarchicalBeanFactory (HBF) :
继承BF,也就是在BF的基础上增加了对parentFactory的支持
FactoryBeanRegistrySupport:
在DefaultSingletonBeanRegistry的基础上增加了对FactoryBean的特殊处理
ConfigurableBeanFactory:
提供配置Factory的各种方法
ListableBeanFactory :
根据各种条件获取bean 的配置清单
AbstractBeanFactory:
综合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能
AutowireCapableBeanFactory:
提供创建bean,自动注入,初始化以及应用bean的后置处理器AbstractAutowireCa-pableBeanFactory
综合AbstractBe-anFactory 并对接口AutowireCapableBe-anFactory进行实现
BeanDefinationRegistry(BDR):
定义了对BD的各种增删该查操作
ConfigurableListableBeanFactory:
BeanFactory(BF)配置清单,指定忽略类型以及接口等
DefaultListableBeanFactory:
综合上述所有功能,主要是对bean注册后的处理
spring的基础容器和高级容器
BeanFactory:
是Spring里面最低层的接口,提供了最简单的容器的功能,BeanFactory负责配置、创建、管理Bean,提供获取bean,是否包含bean,是否单例与原型,获取bean类型,bean 别名的方法
ApplicationContext:
应用上下文,ApplicationContext接口是由BeanFactory接口派生出来的,同样也是Spring更高级的容器;
ApplicationContext提供了更多的额外的功能,默认初始化所有的Singleton,支持国际化,资源访问,消息发送、响应机制,AOP。

总结
本章节只是对spring的一个简单的介绍,看本章内容可以重点关注BeanFactory继承体系,了解BeanFactory的继承体系对spring的源码理解会有很大的帮助。
下一章节重点介绍的是怎么看源码,再源码里面进行断点测试,第一次怎么去看源码,应该从那里看。

扫码关注,领取Java学习图鉴
↓ ↓ ↓




你“在看”我吗?
