Spring 是一个开源的轻量级 Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架, 其目的是用于简化企业级应用程序开发。
Spring 框架除了帮我们管理对象及其依赖关系,还提供像通用日志记录、性能统计、安全控制、异常 处理等面向切面的能力,还能帮我管理最头疼的数据库事务,本身提供了一套简单的 JDBC 访问实现, 提供与第三方数据访问框架集成(如 Hibernate、JPA),与各种 Java EE 技术整合(如 Java Mail、 任务调度等等),提供一套自己的 web 层框架 Spring MVC、而且还能非常简单的与第三方 Web 框架集 成。
Spring 是为解决企业级应用开发的复杂性而设计,一个最根本的使命:简化开发。
而 Spring 则立志于全方面的简化 Java 开发。对此,她主要采取了 4 个关键策略:
1,基于 POJO 的轻量级和最小侵入性编程;
2,通过依赖注入和面向接口松耦合;
3,基于切面和惯性进行声明式编程;
4,通过切面和模板减少样板式代码;
而他主要是通过:面向 Bean、依赖注入以及面向切面这三种方式来达成的。
Spring 提供了 IOC 容器通过配置文件或者注解的方式来管理对象之间的依赖关系。
Spring 设计的核心 org.springframework.beans 包(架构核心是 org.springframework.core 包),这个包通常不是由用户直接使用,而是由服务器将 其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现, 允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。
BeanFactory 支持两个对象模型。
1,单例:模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是 默认的也是最常用的对象模型。对于无状态服务对象很理想。
2,原型:模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适 合
面向切面编程,即 AOP,是一种编程思想,它允许程序员对横切关注点或横切典型的职责分界线的 行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面(切面),它将那些影响多个类的行 为封装到可重用的模块中。
AOP 编程的常用场景有:Authentication 权限认证、Logging 日志、Transctions Manager 事务、 Lazy Loading 懒加载、Context Process 上下文处理、Error Handler 错误跟踪(异常捕获机制) 、Cache 缓存。
a、核心容器:
由 spring-beans、spring-core、spring-context 和 spring-expression(Spring Expression Language, SpEL) 4 个模块组成。
spring-beans 和 spring-core 模块是 Spring 框架的核心模块,包含了控制反转(Inversion of Control, IOC)和依赖注入(Dependency Injection, DI)。BeanFactory 接口是 Spring 框架中 的核心接口,它是工厂模式的具体实现。BeanFactory 使用控制反转对应用程序的配置和依赖性规范与 实际的应用程序代码进行了分离。但 BeanFactory 容器实例化后并不会自动实例化 Bean,只有当 Bean 被使用时 BeanFactory 容器才会对该 Bean 进行实例化与依赖关系的装配。
spring-context 模块构架于核心模块之上,他扩展了 BeanFactory,为她添加了 Bean 生命周期 控制、框架事件体系以及资源加载透明化等功能。此外该模块还提供了许多企业级支持,如邮件访问、 远程访问、任务调度等,ApplicationContext 是该模块的核心接口,她是 BeanFactory 的超类,与 BeanFactory 不同,ApplicationContext 容器实例化后会自动对所有的单实例 Bean 进行实例化与 依赖关系的装配,使之处于待用状态。
b、AOP 和设备支持:
由 spring-aop、spring-aspects 和 spring-instrument 3 个模块组成
在 Spring 中,他是以 JVM 的动态代 理技术为基础,然后设计出了一系列的 AOP 横切实现,比如前置通知、返回通知、异常通知等,同时, Pointcut 接口来匹配切入点,可以使用现有的切入点来设计横切面,也可以扩展相关方法根据需求进 行切入。
spring-aspects 模块集成自 AspectJ 框架,主要是为 Spring AOP 提供多种 AOP 实现方法。
c、数据访问及集成:
由 spring-jdbc、spring-tx、spring-orm、spring-jms 和 spring-oxm 5 个 模块组成
spring-jdbc 模块是 Spring 提供的 JDBC 抽象框架的主要实现模块,用于简化 Spring JDBC。主 要是提供 JDBC 模板方式、关系数据库对象化方式、SimpleJdbc 方式、事务管理来简化 JDBC 编程;
spring-tx 模块是 Spring JDBC 事务控制实现模块。
spring-orm 模块是 ORM 框架支持模块,主要集成 Hibernate, Java Persistence API (JPA) 和 Java Data Objects (JDO) 用于资源管理、数据访问对象(DAO)的实现和事务策略。
spring-jms 模块(Java Messaging Service)能够发送和接受信息
d.Web:
由 spring-web、spring-webmvc、spring-websocket 和 spring-webflux 4 个模块组 成。
spring-web 模块为 Spring 提供了最基础 Web 支持,主要建立于核心容器之上,通过 Servlet 或 者 Listeners 来初始化 IOC 容器,也包含一些与 Web 相关的支持。
spring-webmvc 模 块 众 所 周 知 是 一 个 的 Web-Servlet 模 块 , 实 现 了 Spring MVC (model-view-Controller)的 Web 应用。 spring-websocket 模块主要是与 Web 前端的全双工通讯的协议。
e、报文发送:
即 spring-messaging 模块。
spring-messaging 是从 Spring4 开始新加入的一个模块,主要职责是为 Spring 框架集成一些基 础的报文传送应用。
f.Test:
即 spring-test 模块。
spring-test 模块主要为测试提供支持的
IOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创 建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让 容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们可配置的文件。
DI(Dependency Injection)依赖注入:就是指对象是被动接受依赖类而不是自己主动去找,换句话说 就是指对象不是从容器中查找它依赖的类,而是在容器实例化对象的时候主动将它依赖的类注入给它。 先从我们自己设计这样一个视角来考虑: 对象和对象关系怎么表示? 可以用 xml,properties 文件等语义化配置文件表示。
a、BeanFactory
Spring Bean 的创建是典型的工厂模式,这一系列的 Bean 工厂,也即 IOC 容器为开发者管理对象 间的依赖关系提供了很多便利和基础服务,在 Spring 中有许多的 IOC 容器的实现供用户选择和使用, 其相互关系如下:
其中 BeanFactory 作为最顶层的一个接口类,它定义了 IOC 容器的基本功能规范,BeanFactory 有三 个子类:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。 但是从上图中我们可以发现最终的默认实现类是 DefaultListableBeanFactory,他实现了所有的接 口。那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合, 它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限 制。例如 ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表 示的是这些 Bean 是有继承关系的,也就是每个 Bean 有可能有父 Bean。AutowireCapableBeanFactory接口定义 Bean 的自动装配规则。
在 BeanFactory 里只对 IOC 容器的基本行为作了定义,根本不关心你的 Bean 是如何定义怎样加载的。 正如我们只关心工厂里得到什么的产品对象,至于工厂是怎么生产这些对象的,这个基本的接口不关心。 而要知道工厂是如何产生对象的,我们需要看具体的 IOC 容器实现,Spring 提供了许多 IOC 容器的实现。比如 XmlBeanFactory,ClasspathXmlApplicationContext 等。其中 XmlBeanFactory 就 是针对最基本的 IOC 容器的实现,这个 IOC 容器可以读取 XML 文件定义的 BeanDefinition(XML 文件中对 bean 的描述),如果说 XmlBeanFactory 是容器中的屌丝,ApplicationContext 应该算容器中 的高帅富.
ApplicationContext 是 Spring 提供的一个高级的 IOC 容器,它除了能够提供 IOC 容器的基本功 能外,还为用户提供了以下的附加服务。 从 ApplicationContext 接口的实现,我们看出其特点:
1.支持信息源,可以实现国际化。(实现 MessageSource 接口)
2.访问资源。(实现 ResourcePatternResolver 接口,后面章节会讲到)
3.支持应用事件。(实现 ApplicationEventPublisher 接口)
b、BeanDefinition
SpringIOC 容器管理了我们定义的各种 Bean 对象及其相互的关系,Bean 对象在 Spring 实现中是 以 BeanDefinition 来描述的,其继承体系如下:
Bean 的解析过程非常复杂,功能被分的很细,因为这里需要被扩展的地方很多,必须保证有足够的灵 活性,以应对可能的变化。Bean 的解析主要就是对 Spring 配置文件的解析。这个解析过程主要通过下 图中的类完成:
c、IOC 容器的初始化
IOC 容器的初始化包括 BeanDefinition 的 Resource 定位、载入和注册这三个基本的过程。
详细可以从我的GitHub下载源码进行学习,对关键步骤我都有进行注释。如果对您有帮助,麻烦三连,您的支持,是我进行原创最大的动力!