概述
Spring 是一个开放源代码的设计层面框架, 他解决的是业务逻辑层和其他各层的松耦合问题, 因此它将面向接口的编程思想贯穿整个系统应用. Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架, 由 Rod Johnson 创建. 简单来说, Spring 是一个分层的 JavaSE/EE full-stack(一站式) 轻量级开源框架.
spring 的整体架构
Spring 框架是一个分层架构, 它包含一系列的功能要素, 并被分为大约 20 个模块, 如下图所示:
从上图 spring framework 整体架构图可以看到, 这些模块被总结为以下几个部分:
1. Core Container
Core Container(核心容器) 包含有 Core,Beans,Context 和 Expression Language 模块
Core 和 Beans 模块是框架的基础部分, 提供 IoC(转控制) 和依赖注入特性. 这里的基础概念是 BeanFactory, 它提供对 Factory 模式的经典实现来消除对程序性单例模式的需要, 并真正地允许你从程序逻辑中分离出依赖关系和配置.
Core 模块主要包含 Spring 框架基本的核心工具类
Beans 模块是所有应用都要用到的, 它包含访问配置文件, 创建和管理 bean 以及进行 Inversion of Control/Dependency Injection(IoC/DI) 操作相关的所有类
Context 模块构建于 Core 和 Beans 模块基础之上, 提供了一种类似于 JNDI 注册器的框架式的对象访问方法. Context 模块继承了 Beans 的特性, 为 Spring 核心提供了大量扩展, 添加了对国际化 (如资源绑定), 事件传播, 资源加载和对 Context 的透明创建的支持. ApplicationContext 接口是 Context 模块的关键
Context 模块构建于 Core 和 Beans 模块基础之上, 提供了一种类似于 JNDI 注册器的框架式的对象访问方法. Context 模块继承了 Beans 的特性, 为 Spring 核心提供了大量扩展, 添加了对国际化 (如资源绑定), 事件传播, 资源加载和对 Context 的透明创建的支持. ApplicationContext 接口是 Context 模块的关键
Expression Language 模块提供了一个强大的表达式语言用于在运行时查询和操纵对象, 该语言支持设置 / 获取属性的值, 属性的分配, 方法的调用, 访问数组上下文, 容器和索引器, 逻辑和算术运算符, 命名变量以及从 Spring 的 IoC 容器中根据名称检索对象
2. Data Access/Integration
JDBC 模块提供了一个 JDBC 抽象层, 它可以消除冗长的 JDBC 编码和解析数据库厂商特有的错误代码, 这个模块包含了 Spring 对 JDBC 数据访问进行封装的所有类
ORM 模块为流行的对象 - 关系映射 API, 如 JPA,JDO,Hibernate,iBatis 等, 提供了一个交互层, 利用 ORM 封装包, 可以混合使用所有 Spring 提供的特性进行 O/R 映射, 如前边提到的简单声明性事务管理
OXM 模块提供了一个 Object/xml 映射实现的抽象层, Object/xml 映射实现抽象层包括 JAXB,Castor,XMLBeans,JiBX 和 XStream
JMS(java Message Service) 模块主要包含了一些制造和消费消息的特性
Transaction 模块支持编程和声明式事物管理, 这些事务类必须实现特定的接口, 并且对所有 POJO 都适用
3. web
Web 上下文模块建立在应用程序上下文模块之上, 为基于 Web 的应用程序提供了上下文, 所以 Spring 框架支持与 Jakarta Struts 的集成. Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作. Web 层包含了 Web,Web-Servlet,Web-Struts 和 Web,Porlet 模块
Web 模块: 提供了基础的面向 Web 的集成特性, 例如, 多文件上传, 使用 Servlet
listeners 初始化 IoC 容器以及一个面向 Web 的应用上下文, 它还包含了 Spring 远程支持中 Web 的相关部分
Web-Servlet 模块 Web.servlet.jar: 该模块包含 Spring 的 model-view-controller(MVC) 实现, Spring 的 MVC 框架使得模型范围内的代码和 Web forms 之间能够清楚地分离开来, 并与 Spring 框架的其他特性基础在一起
Web-Struts 模块: 该模块提供了对 Struts 的支持, 使得类在 Spring 应用中能够与一个典型的 Struts Web 层集成在一起
Web-Porlet 模块: 提供了用于 Portlet 环境和 Web-Servlet 模块的 MVC 的实现
4. AOP
AOP 模块提供了一个符合 AOP 联盟标准的面向切面编程的实现, 它让你可以定义例如方法拦截器和切点, 从而将逻辑代码分开, 降低它们之间的耦合性, 利用 source-level 的元数据功能, 还可以将各种行为信息合并到你的代码中
Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务, 通过使用 Spring AOP, 不用依赖 EJB 组件, 就可以将声明性事务管理集成到应用程序中
5. Test
Test 模块支持使用 Junit 和 TestNG 对 Spring 组件进行测试
环境搭建
gradle 安装
Gradle 是一个基于 JVM 的构建工具, 是一款通用灵活的构建工具, 支持 maven, Ivy 仓库, 支持传递性依赖管理, 而不需要远程仓库或者是 pom.xml 和 ivy.xml 配置文件, 基于 Groovy,build 脚本使用 Groovy 编写, 需要到 gradle 官网下载对应版本, http://services.gradle.org/distributions
Windows 环境下需要修改系统变量, 添加 GRADLE_HOME 系统变量, 指向 gradle 根目录. 环境配置成功后, 在命令行输入: gradle -v 显示如下截图:
源码链接获取
1. 进入官网 https://projects.spring.io/spring-framework/ , 点击那个小猫的图像, 进入 GitHub 下载相应版本的 spring 源码.
2. 切换为最新的 Spring 5.1. x 版 源码 , 获取 Git 分支链接
源码下载及 IDEA 导入
1. IDEA Spring Git 拉取分支
2. 本地安装目录设置
3. 拉取等待
4. 开始编译
进入 spring-framework 文件夹下, 打开 cmd, 输入
gradlew :spring-oxm:compileTestJava
进行编译, 会去下载 spring 依赖的一些包
5.IDEA 导入源码
此处的 gradle 使用我们之前自己安装的 4.3.1 版本, 不要用 IDE 自带的;
将 jdk 版本升级到 1.8, 因为在最新的 Spring 中使用到了 jdk1.8 的新特性, 如果不升级到 1.8 会报错;
之后 idea 会自动编译整个项目, 大概一个小时左右.
导入项目遇见问题
1.No such property: immutableValues for class: org.gradle.API.internal.tasks.DefaultTaskDependency
修改: spring-beans.gradle
注释掉这两行代码
- //def deps = compileGroovy.taskDependencies.immutableValues + compileGroovy.taskDependencies.mutableValues
- //compileGroovy.dependsOn = deps - 'compileJava'
- 2.Could not find method useJUnitPlatform()
注释: spring-test.gradle 中这行代码
// useJUnitPlatform { // includeEngines 'junit-jupiter' // excludeTags 'failing-test-case' // }
创建测试项目
导入成功之后可以在 project 下创建一个自己的测试 module
1. 项目根目录右键 -> new -> module -> gradle
2. 在新项目的 build.gradle 下添加对 spring 模块的依赖, 这里我先添加了 spring-beans 和 spring-core 的依赖.
dependencies { compile(project(":spring-beans")) compile(project(":spring-core")) testCompile group: 'junit', name: 'junit', version: '4.12' }
3. 在新项目的 src/main/resource 下添加 spring-config.xml 文件
<?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"> <bean id="myTestBean" class="com.chenhao.spring.MyTestBean"/> </beans>
4. 创建测试 bean 和启动类
package com.chenhao.spring; /** * @author: ChenHao * @Description: * @Date: Created in 10:35 2019/6/19 * @Modified by: */ public class MyTestBean { private String name = "ChenHao"; public MyTestBean(String name) { this.name = name; } public MyTestBean() { } @Override public String toString() { return "MyTestBean{" + "name='" + name + '\'' + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } } import com.chenhao.spring.MyTestBean; import org.junit.Test; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; /** * @author: ChenHao * @Description: * @Date: Created in 10:36 2019/6/19 * @Modified by: */ public class AppTest { @Test public void MyTestBeanTest() { BeanFactory bf = new XmlBeanFactory( new ClassPathResource("spring-config.xml")); MyTestBean myTestBean = (MyTestBean) bf.getBean("myTestBean"); System.out.println(myTestBean.getName()); } }
之后就可以愉快的调试 spring 源码了.
来源: https://www.cnblogs.com/java-chen-hao/p/11046190.html