Spring的架构体系
spring总共大约有20多个模块,由有1300多个文件组成。而这些组件分别整合在核心容器Core Container,AOP和Instrumentation,Data Access/Integration,Messaging,test,6个模块中如下图
· Data Access/Integration(数据访问层)
1.JDBC 顾名思义数据库连接一系列接口规范没啥花露水 提供JDBCtemplate访问数据库的模板
2.ORM rowMapper对象关系映射
3.OXM O/X映射器 Object与XML的映射,通俗来讲是bean与Xml之间的转换过程(编组和解组),对了 可能你已经想到Spring的xml注入方式了。不过过于繁琐基本上不怎么使用了
4.JMS 这个模块是同JDBC一般,Spring集成简化jms api,JMS 大家可能最熟悉了,send、receive消息(receive是同步式的,会block)这个模块应该不常用(JmsTemplate并不能通吃所有操作,需要one to one配置,博主自己也没用过,甚是繁琐)
5.Transactions Spring的事务管理,数据库的基础基础自带知识吧。
· Web
1.webSocket ws协议支持,与客户端网页通讯机制,内置是tomcat为容器
2.Servlet Http访问
3.Web SpringMvc
4.portlet 页面 (比如jsp)
· Aop
面向切面编程 代理模式的应用 上一章有介绍
· Aspect
切面,引用的是CGLIB库
·Instrumentation
修改类文件的字节码,以达到动态aop的作用
·Messaging
消息模块,集成messaging api和消息协议提供支持
·Core Container
1.beans BOP,Spring bean
2.core 核心实现逻辑
3.context IOC容器
4.SpEL el表达式
·Test
Spring-test 测试模块 Junit
Spring的架构体系依赖关系
其中struct 4.0中已被排除,因为Spring已有完整的mvc体系(Struct的表达式好像存在bug博主记得),该图是Spring3.X的架构依赖图
Spring源码下载个人仓库
https://github.com/markpop8/spring-framework.git
首先博主建议在攻读spring 源码的时候应该熟悉设计模式
Spring的IOC体系结构
Spring的Bean的创建是典型的工厂模式,在Spring中有许多IOC可供我们选择和使用,关系如下:
Spring的Factory
我们先看下基础beanFacory接口中常用方法
BeanFactory: 最底层接口 所有的工厂都是继承自这个接口 ,定义了基本规范
ListableBeanFactory:bean是可列表化的,是由此工厂生产而出
Hierarchical :存在父子关系的bean ,此bean可能有父级
AutowireCapableBeanFactory :自动注入的bean,定义了bean的自动装配规则,一种隐式注入
DefaultListableBeanFactory 最终主要实现类
其他IOC的实现比如XmlBeanFactory,ClasspathXmlApplicationBeanFactory(读取xml的工厂现在基本不用)
了)
我们就说说最基本常见的.ApplicationContext
ApplicationBeanFactory接口提供了IOC容器的基本操作外,还实现了MessageSource接口,实现国际化,访问资源,实现ResourcePatternResolver接口,实现ApplicationEventPublisher接口,支持事件推送
ApplicationContext体系
通常我们使用的ApplicationContext一般是继承自ConfigurableWebApplicationContext
这里博主实现了ApplicationContextAware 自动set了此Factory 是用servlet所写的,是Springboot包中的继承关系,这里的工厂好像是有刷新机制,具体会销毁后再去创建DefaultListableBeanFactory
Spring的Factory中的Bean
XML形式
BeanDefinition
bean的定义,bean的规范
如下图规范
读到注册的BeanDefinition对象后(实际也会保存在容器中),后通过一些列接口去读取注册
所以 Bean的类型不同是会更具不同类型的工厂去生成的,IOC容器的初始化中包括BeanDefinition的Resource定位,载入 注册三个过程。
不使用XML
通过注解
@Bean
在获取到所有的bean defenition之后,Spring会有一些post process执行,其中一个就是ConfigurationClassPostProcessor, 在这里,Spring会遍历所有的bean definition, 如果发现其中有标记了@Configuration注解的,会对这个类进行CGLIB代码,生成一个代理的类,并且把这个类设置到BeanDefenition的Class属性中。当需要拿到这个bean的实例的时候,会从这个class属性中拿到的Class对象进行反射,那么最终反射出来的是代理增强后的类。
这里拓展一下其实加载Bean 就是以重委托机制 这是Spring很好的思想