Spring5 概述
一,概述
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 到底能帮我们做些什么?
1.1 , 一切从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++,他看起来还是太简易了,以至于无法胜任任何”实际的”工作。
同样在这一年的 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 框架也是在这样的大环境下出现
的。
1.2 ,Spring 设计的初衷
Spring 是为解决企业级应用开发的复杂性而设计,她可以做很多事。但归根到底支撑 Spring 的仅
仅是少许的基本理念,而所有地这些的基本理念都能可以追溯到一个最根本的使命:简化开发。这是一
个郑重的承诺,其实许多框架都声称在某些方面做了简化。
而 Spring主要是通过:面向 Bean、依赖注入以及面向切面这三种方式来达成的。
1.3 ,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 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间
调用方法。
1.3 ,依赖注入的基本概念
Spring 设计的核心 org.springframework.beans 包(架构核心是 org.springframework.core
包),它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将
其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,
允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。
BeanFactory 支持两个对象模型。
- 单例:模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是
默认的也是最常用的对象模型。对于无状态服务对象很理想。 - 原型:模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适
合。Bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC则将处理事情的责任从应用程序代码转移框架。
1.4 ,AOP 编程理念
面向切面编程,即 AOP,是一种编程思想,它允许程序员对横切关注点或横切典型的职责分界线的
行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面(切面),它将那些影响多个类的行
为封装到可重用的模块中。
AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型
的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP
方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势
就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应
用程序代码是松散耦合的。
AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。
AOP 编程的常用场景有:Authentication 权限认证、Logging 日志、Transctions Manager 事务、
Lazy Loading 懒加载、Context Process 上下文处理、Error Handler 错误跟踪(异常捕获机制)
、Cache 缓存。
文档有参考其他资料,如果问题请联系我,进行删除!