Spring源码解析——前期环境准备

什么是Spring?

Spring是2003年出现的轻量级Java开源框架,是目前Java开发应用程序使用最广,生态最好的开源框架之一,由Rod Johnson在`《Expert One-On-One J2EE Design and Development》`中阐述的部分理念和原型衍生而来。

Spring架构分析

Spring采用分层架构,共大约20个模块,具体可总结为以下几个部分:

Core Container——核心容器

    Core Container(核心容器)包含有Core、Beans、Context和Expression Language模块。

    1.1 简介

       Core和Bean都是框架的核心部分,包含了IOC——控制反转与DI——依赖注入的特性。BeanFactory是基础接口,提供了对工厂模式的经典实现来满足在Spring中对Bean的单例化支持,并允许将依赖关系与配置独立于程序逻辑之外。

    1.2 具体介绍

       1.2.1  Core模块:包含Spring框架核心工具类,是其他组件能够正常运行的基础,Core模块中的工具类搭建了Spring的基石,是其他组件的基础核心。允许在自己的应用程序中使用。
       1.2.2  Bean模块:包含访问配置文件、创建与管理Bean以及IOC及DI操作的所有类。
       1.2.3  Context模块:构建于Core与Bean模块之上,属于Spring的拓展模块,为Spring提供了大量的拓展,如:国际化支持、事件传播、资源加载和对Context的透明创建支持;ApplicationContext接口是Context模块的关键接口。
       1.2.4  Expression Language模块:表达式语言可用于在运行时查询与操作对象。由`JSP2.1`中的`undefine expressional languae`拓展而来,该种语言支持设置/获取属性的值,属性分配,方法的调用,访问数组上下文以及容器/所引起、逻辑与算术运算符、命名变量或者是我们所说的Spring中的IOC根据名称检索对象。也支持list映射、选择和一般的list聚合。

Data Access/Integration——数据整合

    1.1 简介

       Data Access/Integration包含了JDBC、ORM、OXM、JMS和Tramsaction模块。这里我理解就是用于实现数据集成的模块,包括但不限于Mysql、MongoDB等,通过SPI接口提供Spring的顶级接口,服务厂商自定义实现集成。

    1.2 具体介绍

        1.2.1  JDBC模块:提供了JDBC的抽象层,包含了Spring对JDBC进行数据访问进行封装的所有类。
        1.2.2  ORM模块:对象关系映射的核心,提供了如:JSP、JDO、Hibernate以及iBatis等,提供了一个交互层。利用ORM封装,可以混合所有的Spring提供的特性进行O/R映射。Spring中提供了JDO、Hibernate和iBatisSQL Map等ORM对象关系工具,遵从Spring的通用事务和DAO的异常层次结构。
        1.2.3  OXM模块:提供Object/Xml文件的抽象映射,具体实现包括JAXB、Castor、XMLBeans、JiBX和XStream。
        1.2.4  Transaction模块:支持编程与声明式的事务管理(Transactional注解声明方法是否支持事务)。

Web——Web应用程序支持模块

    1.1 简介

        Web应用程序上下文模块建立在应用程序上下文基础之上,只是对基于Web的应用程序提供了额外的上下文。因此Spring支持集成Struts。该模块简化了请求处理以及域对象绑定参数工作,内部包含Web、Web-Servlet、Web-Strucs和Web-Prolet模块。

    1.2  具体介绍

        1.2.1  Web模块:提供基础面向网络应用程序的集成特性,包括多文件上传、使用servlet listeners初始化IOC容器以及一个Web的应用上下文,同时包含了Spring远程支持中WEb的相关部分。
        1.2.2  Web Servlet模块:包含Spring-MVC实现。
        1.2.3  Web-Struts模块:模块包含了Spring对Struts的支持,使得类在Spring应用中能够与Struts Web层集成。(个人对Struts不是很清楚,后续如有机会学习会进行补充)。
        1.2.4  Web-Prolet模块:提供用于Prolet环境和Web-Servlet模块的MVC实现。

AOP——面向切面编程,基于AspectJ实现,Spring核心功能

    1.1 简介

        AOP是符合AOP联盟标准的面向切面编程具体实现,允许使用者定义方法拦截器/切点/切面,从而实现基于动态代理的程序操作,可以有效解除代码耦合,适合于不同代码块之间具备相同逻辑操作的场景。如:事务、连接释放等。Spring-AOP通过配置管理的特性,将面向切面编程的功能集成到了Spring框架中,因此可以很容易地使得Spring框架去管理的任何对象都能够支持AOP。Spring AOP同时也是声明式事务的实现基础,AOP提供了一个事务管理服务,通过使用Spring AOP,不再需要依赖EJB组件就可以使得应用程序集成声明式事务。

    1.2  具体介绍

        1.2.1  Aspects模块:提供了对AspectJ的支持。
        1.2.2  Instrumentation模块:提供`class Instrumentation`支持与`classloader`的实现,使得其可以在特定应用服务上使用。

Test——Spring测试单元

        测试模块支持使用Junit和TestNG对Spring程序组件进行测试。

如何拉取Spring项目源码?

1、拉取代码过程参考:https://www.cnblogs.com/hg-super-man/p/16291217.html

2、版本管理:

版本管理
版本下载网址
spring5.2.6.RELEASEhttps://github.com/spring-projects/spring-framework/tree/v5.2.6.RELEASE
jdk1.8https://www.oracle.com/java/technologies/downloads/
gradle5.6.4https://services.gradle.org/distributions/

下载Gradle

标红的地方即为Gradle版本


修改项目目录下build.gradle内容:


修改项目目录下gradle.properties内容:

注释掉build.gradle下内容:


在IDEA开发工具中打开项目,等待自动构建。

Spring容器

一开始学习Spring时,相信大家都听过:Spring是一个Bean的容器,对于Spring来说,其内部管理的Bean是核心,我们的学习也是基于Spring如何管理、创建、销毁以及如何通过依赖注入的方式实现Bean的嵌套等概念。

接下来我们要创建一个Bean来复习一下Spring最原始的样子:

public class MyTestBean {
    private String testStr = "Hello Spring";
        
    // getter & setter方法
}

xml注册Bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    // 这里的class指的是当前Bean的映射关系,即当前注册的Bean来源于哪个具体的类,指定映射路径时使用绝对路径全限定名
    <!--
        id:Spring唯一标识
        class:bean所对应的类的全限定名
     -->
    <bean id="myTestBean" class="com.cattywhale.MyTestBean"></bean>
    ​
</beans>

书写Test测试Bean是否注册成功

@SuppressWarnings("deprecation")
public class BeanFactoryTest {
        @Test
        public void testBeanFactory() {
           // 获取Bean工厂
           BeanFactory beanFactory =  new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));
           // 根据id获取Bean
           MtTestBean bean = (MyTestBean)beanFactory.getBean("myTestBean");
           // 校验内容是否一致
           System.out.println("Hello Spring".equals(bean.getTestStr()));    //   此处最终打印结果为true则说明bean创建成功 
        }
    }

在日常使用中,通常使用ApplicationContext作为Bean的容器而不使用BeanFactory作为Spring存放Bean的容器,二者区别如下,ApplicationContext具备比BeanFactory更为强大的功能性。

后续会具体补充这部分,BeanFactory作为Spring的顶级接口,实现了Bean的创建、管理与销毁过程,需要了解的地方也更多一些。

努力提升技术,学习架构的鲸鱼,每日都会更新spring相关笔记,希望各位大佬或者是友友们多多关注,对于不足的地方可以在评论区直接评论,你们的建议是未来改善博文质量的方向!!
 

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值