1. Spring整体架构
Spring是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,Spring整体架构图如下:
1.1 核心容器(Core Container)
核心容器(Core Container)部分包含有Core
、Beans
、Context
和Expression Language
模块,其中Core
和Beans
模块是框架的基础部分,提供IOC(控制反转)和依赖注入特性,基础概念是BeanFactory
,它提供对Factory模式的经典实现来消除对程序单例模式的需要,并真正的允许从程序中分离出依赖关系和配置。
- Core:包含Spring框架的基本核心工具类,Spring其他组件都要用到这个包里的类,Core是其他组件的基础。
- Beans:包含访问配置文件、创建和管理Bean,以及控制反转/依赖注入(IOC/DI)操作相关的所有类。
- Context:构建于Core和Beans模块基础之上,提供了一种类似于JNDI注册器的框架式的对象访问方法。Context继承了Beans的特性,为Spring核心提供了大量扩展,添加了对国际化、事件传播、资源加载核对Context透明创建的支持。也支持J2EE的一些特性,例如EJB、JMX等等,
ApplicationContext
接口时Context模块的关键。 - Expression Language:提供了强大的表达式语言,用于在运行时查询和操纵对象。是JSP 2.1 规范中
unifed experssion language
的扩展。该语言支持设置/获取属性的值,属性的分配,方法的调用,访问方法上下文、容器和索引等等。
1.2 数据访问和集成(Data Access/Integration)
Data Access/Integration包含JDBC
、ORM
、OXM
、JMS
和Transaction
模块。
- 包含了Spring对JDBC数据访问进行封装的所有类,提供了一个JDBC抽象层,可以消除冗长的JDBC编码和解析数据库厂商特有的错误代码。
- ORM:流行的对象-关系映射API,如JPA、JDO、Hibernate、iBatis等,提供了一个交互层,可以混合使用所有Spring提供的特性进行O/R映射。
- OXM:提供了一个对象Object/XML映射实现的抽象层,Object/XML映射实现包括JAXB、Castor、XMLBeans、JiBX和XStream。
- JMS:JMS(Java Messageing Service)模块主要包括了一些制造和消费消息的特性。
- Transaction:支持编程和声明性的事务管理,这些事务类必须实现特定的接口,并且对所有的POJO都适用。
1.3 web
Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供上下文,所以Spring框架支持与Jakarta Struts的集成,Web模块还简化了处理大部分请求以及将请求参数绑定到域对象的工作。Web层包含了Web
、Web-Servlet
、Web-Strtus
和Web-Porlet
模块。
- Web:提供了基础的面向Web的集成特性。
- Web-Servlet:该模块包含Spring的model-view-controller(MVC)实现。
- Web-Strtus:该模块提供了对Strtus的支持,使得类在Spring应用中能够与一个典型的Strtus Web层集成在一起,该支持在Spring 3.0中已经被弃用了。
- 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. 环境搭建
-
本文环境
- git version 2.27.0.windows.1
- java version "1.8.0_265"
- IntelliJ IDEA 2020.1.1
- Spring 5.0.x
-
源码获取
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
-
使用IDEA导入
使用IDEA导入,需要保证网络可用。按默认配置加载即可. -
添加模块
添加一个模块,用于调用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"))
}
- 搭建完成
3. 问题解决
3.1 IDEA输出中文乱码
启动参数的vm option
虚拟机选项添加-Dfile.encoding=UTF-8
即可。