什麽是Spring?
Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的开源容器(框架)。
优点:
- 开源免费
- 非侵入,轻量级
- 对事务的支持,对框架的支持
什么是 “控制反转” “依赖注入”?
控制反转
将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。
IoC 容器是 Spring 用来实现 IoC 的载体,IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。
依赖注入
将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。
整体架构
Core Container
Core Container(核心容器)包含有 Core、Beans、Context 和 SpEL 模块。其中 Core 和 Beans 模块是框架的基础部分,提供 IoC(控制反转)和依赖注入功能。
Core
主要包含 Spring 框架基本的核心工具类。
Beans
是所有应用都要用到的,它包含访问配置文件、创建和管理 bean 以及进行 Inversion of Control/Dependency Injection(Ioc/DI) 操作相关的所有类。
Context
构建于 Core 和 Beans 模块基础之上,提供了一种类似于 JNDI 注册器的框架式的对象访问方法。Context 模块继承了 Beans 的特性,为 Spring 核心提供了大量的扩展,添加了对国际化(如资源绑定)、事件传播、资源加载和对 Context 的透明创建的支持。
SpEL
只依赖于 Core 模块,可以单独使用。该模块提供了一个强大的表达式语言用于在运行时查询和操纵对象,该语言支持设置/获取属性的值,属性的分配,方法的调用,访问数组上下文、容器和索引器、逻辑和算术运算符、命名变量以及从 Spring 的 IoC 容器中根据名称检索对象。
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
模块主要包含了一些制造和消费消息的特性。
Transaction
支持编程和声明式事物管理,这些事务类必须实现特定的接口,并且对所有 POJO 都适用 。
Web
Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文,所以 Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
AOP
通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。
Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
Test
Test 模块支持使用 Junit 和 TestNG 对 Spring 组件进行测试。
接口
Resource
Resource 主要负责对资源的抽象,它的每一个实现类都代表了一种资源的访问策略,如 ClasspathResource 、 URLResource ,FileSystemResource 等。
Spring 利用 ResourceLoader 来进行统一资源加载,关系图如下:
BeanFactory
资源加载完毕之后就需要 BeanFactory 来进行加载解析,它是一个 bean 容器,其中 BeanDefinition 是它的基本结构,它内部维护着一 个 BeanDefinition map ,并可根据 BeanDefinition 的描述进行 bean 的创建和管理。
BeanFacoty 有三个直接子类 ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory,DefaultListableBeanFactory 为最终默认实现,它实现了所有接口。
BeanDifinition
BeanDefinition 用来描述 Spring 中的 Bean 对象。
BeanDefinitionReader
BeanDefinitionReader 的作用是读取 Spring 配置文件中的内容,将其转换为 IoC 容器内部的数据结构:BeanDefinition。
SpringApplicationContext
ApplicationContext 是个 Spring 容器,也叫做应用上下文。它继承 BeanFactory,同时也是 BeanFactory 的扩展升级版。
由于 ApplicationContext 的结构就决定了它与 BeanFactory 的不同,其主要区别有:
- 继承 MessageSource ,提供国际化的标准访问策略;
- 继承 ApplicationEventPublisher,提供强大的事件机制;
- 扩展 ResourceLoader,可以用来加载多个 Resource,可以灵活访问不同的资源;
- 对 Web 应用的支持。