1. Spring整体架构

Spring是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,Spring整体架构图如下:

Spring整体架构图

1.1 核心容器(Core Container)

核心容器(Core Container)部分包含有CoreBeansContextExpression Language模块,其中CoreBeans模块是框架的基础部分,提供IOC(控制反转)和依赖注入特性,基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序单例模式的需要,并真正的允许从程序中分离出依赖关系和配置。

  1. Core:包含Spring框架的基本核心工具类,Spring其他组件都要用到这个包里的类,Core是其他组件的基础。
  2. Beans:包含访问配置文件、创建和管理Bean,以及控制反转/依赖注入(IOC/DI)操作相关的所有类。
  3. Context:构建于Core和Beans模块基础之上,提供了一种类似于JNDI注册器的框架式的对象访问方法。Context继承了Beans的特性,为Spring核心提供了大量扩展,添加了对国际化、事件传播、资源加载核对Context透明创建的支持。也支持J2EE的一些特性,例如EJB、JMX等等,ApplicationContext接口时Context模块的关键。
  4. Expression Language:提供了强大的表达式语言,用于在运行时查询和操纵对象。是JSP 2.1 规范中unifed experssion language的扩展。该语言支持设置/获取属性的值,属性的分配,方法的调用,访问方法上下文、容器和索引等等。

1.2 数据访问和集成(Data Access/Integration)

Data Access/Integration包含JDBCORMOXMJMSTransaction模块。

  1. 包含了Spring对JDBC数据访问进行封装的所有类,提供了一个JDBC抽象层,可以消除冗长的JDBC编码和解析数据库厂商特有的错误代码。
  2. ORM:流行的对象-关系映射API,如JPA、JDO、Hibernate、iBatis等,提供了一个交互层,可以混合使用所有Spring提供的特性进行O/R映射。
  3. OXM:提供了一个对象Object/XML映射实现的抽象层,Object/XML映射实现包括JAXB、Castor、XMLBeans、JiBX和XStream。
  4. JMS:JMS(Java Messageing Service)模块主要包括了一些制造和消费消息的特性。
  5. Transaction:支持编程和声明性的事务管理,这些事务类必须实现特定的接口,并且对所有的POJO都适用。

1.3 web

Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供上下文,所以Spring框架支持与Jakarta Struts的集成,Web模块还简化了处理大部分请求以及将请求参数绑定到域对象的工作。Web层包含了WebWeb-ServletWeb-StrtusWeb-Porlet模块。

  1. Web:提供了基础的面向Web的集成特性。
  2. Web-Servlet:该模块包含Spring的model-view-controller(MVC)实现。
  3. Web-Strtus:该模块提供了对Strtus的支持,使得类在Spring应用中能够与一个典型的Strtus Web层集成在一起,该支持在Spring 3.0中已经被弃用了。
  4. Web-Porlet:提供了用于Portlet环境Web-Servlet模块的MVC实现。

1.4 AOP

AOP(面向切片)提供了一个符合AOP联盟标准的面向切片编程的实现,可以定义例如方法拦截器和切点等,从而将逻辑代码分开,降低他们之间的耦合性。利用source-level的元数据功能,还可以将各种行为合并到代码中。
Spring AOP为基于Spring的应用程序中的对象提供了事务管理服务,通过使用AOP,不用依赖EJB组件就可以将声明性事务管理集成到应用程序中。

  • Aspects:提供了对AspectJ的集成支持。
  • Instrumentation:提供了class instrumentation支持和classloader实现,使得可以在特定的应用服务器上使用。

1.5 Test

Test模块支持使用JUnit和TestNG对Spring组件进行测试。

2. 环境搭建

  1. 本文环境

    1. git version 2.27.0.windows.1
    2. java version "1.8.0_265"
    3. IntelliJ IDEA 2020.1.1
    4. Spring 5.0.x
  2. 源码获取
    github地址:https://github.com/spring-projects/spring-framework
    本文安装的是5.0.x版本的,可以切换分支到5.0.x进行下载。

使用Git工具进行下载:

git clone -b 5.0.x https://github.com/spring-projects/spring-framework.git
  1. 使用IDEA导入
    使用IDEA导入,需要保证网络可用。按默认配置加载即可.

  2. 添加模块
    添加一个模块,用于调用spring源码api进行学习测试,模块的build.gradle文件添加如下依赖。

dependencies {
    compile group: 'junit', name: 'junit', version: '4.12'
    compile(project(":spring-aop"))
    compile(project(":spring-aspects"))
    compile(project(":spring-beans"))
    compile(project(":spring-context"))
    compile(project(":spring-context-support"))
    compile(project(":spring-context-indexer"))
    compile(project(":spring-core"))
    compile(project(":spring-expression"))
    compile(project(":spring-instrument"))
    compile(project(":spring-jcl"))
    compile(project(":spring-jdbc"))
    compile(project(":spring-jms"))
    compile(project(":spring-messaging"))
    compile(project(":spring-orm"))
    compile(project(":spring-oxm"))
    compile(project(":spring-test"))
    compile(project(":spring-tx"))
    compile(project(":spring-web"))
    compile(project(":spring-webmvc"))
    // compile(project(":spring-webflux"))
    compile(project(":spring-websocket"))
    compile(project(":spring-framework-bom"))
}
  1. 搭建完成

3. 问题解决

3.1 IDEA输出中文乱码

启动参数的vm option虚拟机选项添加-Dfile.encoding=UTF-8即可。