Spring源码分析开篇

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

目录

Spring 5 概述

一切从Bean开始

Spring设计初衷

BOP编程伊始

依赖注入的基本概念

AOP编程理念

Spring5 系统架构

Spring 5 概述

Spring是一个开源的轻量级Java SE(Java标准版本) / Java EE(Java企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。应用程序是由一组相互协作的对象组成,而在传统应用程序开发中,一个完成的应用是由一组相互协作的对象组成。所以开发一个应用除了要开发业务逻辑之外,最 多的是关注如何使这些对象协作来完成所需功能,而且要低耦合、高内聚。业务逻辑开发是不可避免的, 那如果有个框架出来帮我们来创建对象及管理这些对象之间的依赖关系。可能有人说了,比如“抽象工 厂、工厂方法设计模式”不也可以帮我们创建对象,“生成器模式”帮我们处理对象间的依赖关系,不 也能完成这些功能吗?可是这些又需要我们创建另一些工厂类、生成器类,我们又要而外管理这些类, 增加了我们的负担,如果能有种通过配置方式来创建对象,管理对象之间依赖关系,我们不需要通过工 厂和生成器来创建及管理对象之间的依赖关系,这样我们是不是减少了许多工作,加速了开发,能节省 出很多时间来干其他事。Spring 框架刚出来时主要就是来完成这个功能。
Spring 框架除了帮我们管理对象及其依赖关系,还 供像通用日志记录、性能统计、安全控制、异常 处理等面向切面的能力,还能帮我管理最头疼的数据库事务,本身 供了一套简单的 JDBC 访问实现, 供与第三方数据访问框架集成(如 Hibernate、JPA),与各种 Java EE 技术整合(如 Java Mail、 任务调度等等), 供一套自己的 web 层框架 Spring MVC、而且还能非常简单的与第三方 Web 框架集 成。从这里我们可以认为 Spring 是一个超级粘合平台,除了自己 供功能外,还 供粘合其他技术和 框架的能力,从而使我们可以更自由的选择到底使用什么技术进行开发。而且不管是 JAVA SE(C/S 架 构)应用程序还是 JAVA EE(B/S 架构)应用程序都可以使用这个平台进行开发。让我们来深入看一下 Spring 到底能帮我们做些什么?

一切从Bean开始

1996年,Java还只是一个新兴的、初出茅庐的编程语言。人们之所以关注她仅仅是因为,可以使用 Java 的 Applet 来开发 Web 应用。但这些开发者很快就发现这个新兴的语言还能做更多的事情。与之 前的所有语言不同,Java 让模块化构建复杂的系统成为可能(当时的软件行业虽然在业务上突飞猛进, 但当时开发用的是传统的面向过程开发思想,软件的开发效率一直踟蹰不前。伴随着业务复杂性的不断 加深,开发也变得越发困难。其实,当时也是面向对象思想飞速发展的时期,她在 80 年代末被 出, 成熟于 90 年代,现今大多数编程语言都是面向对象的,当然这是后话了)。他们为 Applet 而来,为 组件化而留。这便是最早的 Java。

同样在这一年的 12 月,Sun 公司发布了当时还名不见经传但后来人尽皆知的 JavaBean 1.00-A 规 范。早期的 JavaBean 规范针对于 Java,她定义了软件组件模型。这个规范规定了一整套编码策略,使 简单的 Java 对象不仅可以被重用,而且还可以轻松地构建更为复杂的应用。尽管 JavaBean 最初是为 重用应用组件而设计的,但当时他们却是主要用作构建窗体控件,毕竟在 PC 时代那才是主流。但相比 于当时正如日中天的 Delphi、VB 和 C++,他看起来还是太简易了,以至于无法胜任任何”实际的”工作。

复杂的应用通常需要诸如事物、安全、分布式等服务的支持,但 JavaBean 并未直接 供。所以到 了 1998 年 3 月,Sun 发布了 EJB 1.0 规范,该规范把 Java 组件的设计理念延伸到了服务器端,并 供了许多必须的企业级服务,但他也不再像早期的 JavaBean 那么简单了。实际上,除了名字,EJB Bean 已经和 JavaBean 没有任何关系了。

尽管现实中有很多系统是基于 EJB 构建的,但 EJB 从来没有实现它最初的设想:简化开发。EJB 的 声明式编程模型的确简化了很多基础架构层面的开发,例如事务和安全;但另一方面 EJB 在部署 述符 和配套代码实现等方面变得异常复杂。随着时间的推移,很多开发者对 EJB 已经不再抱有幻想,开始寻 求更简洁的方法。

现在 Java 组件开发理念重新回归正轨。新的编程技术 AOP 和 DI 的不断出现,他们为 JavaBean 供了之前 EJB 才能拥有的强大功能。这些技术为 POJO 供了类似 EJB 的声明式编程模型,而没有引入 任何 EJB 的复杂性。当简单的 JavaBean 足以胜任时,人们便不愿编写笨重的 EJB 组件了。

客观地讲,EJB 的发展甚至促进了基于 POJO 的编程模型。引入新的理念,最新的 EJB 规范相比之 前的规范有了前所未有的简化,但对很多开发者而言,这一切的一切都来得太迟了。到了 EJB 3 规范发 布时,其他基于 POJO 的开发架构已经成为事实的标准了,而 Spring 框架也是在这样的大环境下出现的。

Spring设计初衷

Spring是为了解决企业级应用开发的复杂性而设计,它可以做很多事。但归根到底支持Spring的仅仅是少许的基本概念,而所有这些基本概念都可以追溯到一个最根本的使命:简化开发。

Spring 则立志于全方面的简化 Java 开发。对此,它主要采取了 4 个关键策略:

  1. 基于 POJO 的轻量级和最小侵入性编程;
  2. 通过依赖注入和面向接口松耦合;
  3. 基于切面和惯性进行声明式编程;
  4. 通过切面和模板减少样板式代码;

而它主要是通过:面向 Bean、依赖注入以及面向切面这三种方式来达成的。

BOP编程伊始

Spring 是面向 Bean 的编程(Bean Oriented Programming, BOP),Bean 在 Spring 中才是真 正的主角。Bean 在 Spring 中作用就像 Object 对 OOP 的意义一样,Spring 中没有 Bean 也就没有 Spring 存在的意义。Spring 供了 IOC 容器通过配置文件或者注解的方式来管理对象之间的依赖关系。

控制反转(其中最常见的方式叫做依赖注入(Dependency Injection,DI),还有一种方式叫“依 赖查找”(Dependency Lookup,DL),她在 C++、Java、PHP 以及.NET 中都运用。在最早的 Spring 中是包含有依赖注入方法和依赖查询的,但因为依赖查询使用频率过低,不久就被 Spring 移除了,所以在 Spring 中控制反转也被称作依赖注入),她的基本概念是:不创建对象,但是 述创建它们的方式。 在代码中不直接与对象和服务连接,但在配置文件中 述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器)负责将这些联系在一起。

在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。

依赖注入的基本概念

Spring设计的核心org.springframework.beans包,它的设计目的与Javabean组件一起使用。这个包通常不是由用户直接使用,而是由服务器将 其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现, 允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。

BeanFactory 支持两个对象模型。 1,单例:模型 供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想。 2,原型:模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。
Bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 则将处理事情的责任从应用程序代码转移到框架。

AOP编程理念

面向切面编程,即 AOP,是一种编程思想,它允许程序员对横切关注点或横切典型的职责分界线的 行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面(切面),它将那些影响多个类的行 为封装到可重用的模块中。

AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型 的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势 就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应 用程序代码是松散耦合的。

AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。
AOP 编程的常用场景有:Authentication 权限认证、Logging 日志、Transctions Manager 事务、 Lazy Loading 懒加载、Context Process 上下文处理、Error Handler 错误跟踪(异常捕获机制) 、Cache 缓存。

Spring5 系统架构

Spring总共大约有20多个模块,1300多个不同文件构成。而这些组件被分别整合在核心容器(Core Container)、AOP(Aspect Oriented Programming)和设备支持(Instrmentation)、数据访问及集成(Data Access/Integeration)、Web、报文发送(Messaging)、Test,六个模块集合而成。下图是Spring5 的模块结构图:

20191102100700\_1.png

Spring 官网介绍:

20191102100700\_2.png


来源:http://ddrv.cn

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » Spring源码分析开篇

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏