Spring源码总结与分析

_pangzi · · 1031 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

#### 前言 Spring是什么?它是一个应用程序框架,为应用程序的开发提供强大的支持,例如对事务处理和持久化的支持等;它也是一个bean容器,管理bean对象的整个生命周期,维护bean的各种存在状态,例如bean对象的实例化、销毁、bean的单实例和多实例状态等。 Spring作为Java发展史上不可忽视的存在,说他重新定义了Java也不为过。它功能强大,着实为日常开发提供了大大的便利。表面越简单的东西,背后越复杂。 从本章节开始,我们一起分析Spring的源码,看它到底是怎么样来实现我们常说常用的诸如IOC、Annotation、AOP、事务等功能的。 **小编给大家推荐一个Java技术交流群:937053620!群内提供设计模式、spring/mybatis源码分析、高并发与分布式、微服务、性能优化,面试题整合文档等免费资料!给大家提供一个交流学习的平台!** #### Spring的整体架构: ![](https://upload-images.jianshu.io/upload_images/5959612-d098ab17c1ae5292.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/464/format/webp) 这些模块被总结为以下几个部分: * Core Container Core Container(核心容器)包含有Core、Beans、Context和Expression Language模块 Core和Beans模块是框架的基础部分,提供IoC(转控制)和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置 * Data Access/Integration JDBC模块提供了一个JDBC抽象层,它可以消除冗长的JDBC编码和解析数据库厂商特有的错误代码,ORM模块为流行的对象-关系映射API,如JPA、JDO、Hibernate、iBatis等,提供了一个交互层 * Web Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文,所以Spring框架支持与Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。 * AOP AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现,它让你可以定义例如方法拦截器和切点,从而将逻辑代码分开,降低它们之间的耦合性,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中 * Test Test模块支持使用Junit和TestNG对Spring组件进行测试 #### 容器的基本实现 **Spring的结构组成** beans包的层级结构: 1. src/main/java 用于展现Spring的主要逻辑 2. src/main/resources 用于存放系统的配置文件 3. src/test/java 用于对主要逻辑进行单元测试 4. src/test/resources 用于存放测试用的配置文件 #### 核心类介绍 **1.DefaultListableBeanFactory** XmlBeanFactory继承自DefaultListableBeanFactory,而DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册及加载bean的默认实现,而对于XmlBeanFactory与DefaultListableBeanFactory不同的地方其实是在XmlBeanFactory中使用了自定义的XML读取器XmlBeanDefinitionReader,实现了个性化的BeanDefinitionReader读取,DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory并实现了ConfigURableListableBeanFactory以及BeanDefinitionRegistry接口。 ![](https://upload-images.jianshu.io/upload_images/11633898-dc6504c16d39bcd8.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) **类图中各个类的作用:** * AliasRegistry:定义对alias的简单增删改等操作 * SimpleAliasRegistry:主要使用map作为alias的缓存,并对接口AliasRegistry进行实现 * SingletonBeanRegistry:定义对单例的注册及获取 * BeanFactory:定义获取bean及bean的各种属性 * DefaultSingletonBeanRegistry:对接口SingletonBeanRegistry各函数的实现 * HierarchicalBeanFactory:继承BeanFactory,也就是在BeanFactory定义的功能的基础上增加了对parentFactory的支持 * BeanDefinitionRegistry:定义对BeanDefinition的各种增删改操作 * FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能 * ConfigurableBeanFactory:提供配置Factory的各种方法 * ListableBeanFactory:根据各种条件获取bean的配置清单 * AbstractBeanFactory:综合FactoryBeanRegistrySupport和ConfigurationBeanFactory的功能 * AutowireCapableBeanFactory:提供创建bean、自动注入、初始化以及应用bean的后处理器 * AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory并对接口AutowireCapableBeanFactory进行实现 * ConfigurableListableBeanFactory:BeanFactory配置清单,指定忽略类型及接口等 * DefaultListableBeanFactory:综合上面所有功能,主要是对Bean注册后的处理 #### Spring bean作用域与生命周期 Spring通过new关键字将一个Bean进行实例化,Spring根据xml文件中的配置通过调用Bean中的setXXX方法填入对应的属性、事件通知。 Spring依次检查Bean是否实现了BeanNameAware、BeanFactoryAware、ApplicationContextAware、BeanPostProcessor、InitializingBean接口,如果有的话,依次调用这些接口使用。应用程序可以正常使用这个Bean了。销毁:如果Bean实现了DisposableBean接口,就调用其destroy方法。 #### BeanDefinition的载入和解析 对IoC容器来说,这个载入过程,相当于把定义的BeanDefinition在IoC容器中转化成一个Spring内部表示的数据结构的过程。IoC容器对Bean的管理和依赖注入功能的实现,是通过对其持有的BeanDefinition进行各种相关操作来完成的。这些BeanDefinition数据在IoC容器中通过一个HashMap来保持和维护。 #### Spring容器初始化过程 spring的IoC容器初始化包括:Bean定义资源文件的定位、载入和注册3个基本过程。 当 BeanDefinition 注册完毕以后, Spring Bean 工厂就可以随时根据需要进行实例化了。对于 XmlBeanFactory 来说,实例化默认是延迟进行的。 #### 如何启动spring容器 在Web项目中,启动Spring容器的方式有三种,ContextLoaderListener、ContextLoadServlet、ContextLoaderPlugin。 #### 最后 **其实做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个Java交流群937053620,不管你是小白还是大牛欢迎入驻,大家一起交流成长**

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1031 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传