此系列第一篇已经安装配置好了Spring开发环境,也体验了Spring的一个简单实例,初步觉察到Spring是依靠配置文件来对类进行初始化和配置管理的。我们接着深入学习,明确Spring的核心理念。
Spring的核心是个轻量级的容器,它是实现IoC容器和非侵入性的框架,并提供AOP的实现;提供对持久层、事务的支持;提供MVC Web框架的实现,并对于一些常用的企业API提供一致的模型封装,是一个全方位的应用程序框架。另外对其他各种框架(Struts/Hibernate等)都能很好的相整合。
轻量级:简单说就是核心包在文件容量上比较小,不到1M。而且核心包需要的资源也很少。
非侵入性:框架就是提供一个架构的实现,开发人员可以基于框架快速开发出遵循架构所需的应用程序,如Apache Tuscany框架对SCA架构的实现。但是使用框架的时候,我们就会调用框架的API或者继承其类,导致程序对框架产生依赖,无法在其他地方重用。非侵入性就是希望程序几乎感受不到框架的存在,减少程序从当前框架移到其他框架中时的负担。
容器:容器可以管理对象的生成、资源获取、销毁等,甚至建立对象与对象之间的依赖关系,如Tomcat服务器就可以作为Servlet的容器,负责Servlet的生成销毁和资源(JSP等)的获取。Spring提供了容器功能,它可以根据一个配置文件(如XML),来确定对象名称、如何产生对象、哪个对象的属性引用哪个对象等。在启动容器后,所有的对象就可以直接使用,无需再初始化了,也不需要自己写代码建立对象间的关系。
IoC:IoC-Inversion of Control,即控制反转。针对的是依赖关系的转移,如“实现依赖于抽象”、“高层模块不应该依赖于底层模块,而模块都必须依赖于抽象”、“应用程序不应依赖于容器,而是容器服务于程序”等。控制反转是为了对过去不良的程序依赖设计提出的,目的是解耦、提高可重用性。
在Spring中,我们可以分两点来理解:1. 程序的业务逻辑部分应该具有可重用性,不要依赖于底层,不要调用容器或框架的API。2. 应用程序依赖于抽象的接口,容器通过接口将资源注入到应用程序中。即程序不向容器请求资源,容器主动提供合适的对象。
Spring主要是通过依赖注入来实现IoC的。即保留抽象接口,让组件依赖于抽象接口,当组件要与其他实际的对象发生调用(依赖关系)时,由抽象接口来注入要使用的实际对象。有三种实现方式:接口注入-Interface Injection、设置注入-Setter Injection和构造注入-Constructor Injection。看例子更加明白,如下:
接口注入
设置注入
构造注入
Spring鼓励使用设置注入,但也允许构造注入,尽量避免接口注入。
AOP:Aspect-oriented programming,面向方面编程。它是OOP的延续,主要功能是日志记录、性能统计、安全控制、事务处理、异常处理等。意图是把这些功能的代码从业务逻辑代码中划分出来。AOP是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的技术。Spring支持AOP的实现,允许通过分离应用的业务逻辑与系统级服务进行内聚性开发。应用对象只实现它们应该做的-完成业务逻辑,并不负责其他的系统级关注点。
持久层:数据持久往往指将内存中的数据保存到磁盘上加以固化,持久化的实现过程则大多通过各种关系数据库来完成。持久层就是系统架构中的一个相对独立的逻辑层面,它专注于数据持久化逻辑的实现。既然说到层,那这个层面应该具有一个较为清晰和严格的逻辑边界。