美文网首页Java 杂谈程序员
Spring源码总结与分析

Spring源码总结与分析

作者: _年少无为 | 来源:发表于2019-01-08 15:27 被阅读9次

    前言

    Spring是什么?它是一个应用程序框架,为应用程序的开发提供强大的支持,例如对事务处理和持久化的支持等;它也是一个bean容器,管理bean对象的整个生命周期,维护bean的各种存在状态,例如bean对象的实例化、销毁、bean的单实例和多实例状态等。

    Spring作为Java发展史上不可忽视的存在,说他重新定义了Java也不为过。它功能强大,着实为日常开发提供了大大的便利。表面越简单的东西,背后越复杂。
    从本章节开始,我们一起分析Spring的源码,看它到底是怎么样来实现我们常说常用的诸如IOC、Annotation、AOP、事务等功能的。

    小编给大家推荐一个Java技术交流群:937053620!群内提供设计模式、spring/mybatis源码分析、高并发与分布式、微服务、性能优化,面试题整合文档等免费资料!给大家提供一个交流学习的平台!

    Spring的整体架构:

    这些模块被总结为以下几个部分:

    • 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接口。

    类图中各个类的作用:

    • 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,不管你是小白还是大牛欢迎入驻,大家一起交流成长

    相关文章

      网友评论

        本文标题:Spring源码总结与分析

        本文链接:https://www.haomeiwen.com/subject/sdavrqtx.html