第一部分
Spring核心实现篇
第2章 Spring Framework的核心:IoC容器的实现
第3章 Spring AOP的实现
本篇将对Spring的核心IoC容器和AOP的实现原理进行阐述。IoC容器和AOP是Spring的核心,它们是Spring系统中其他组件模块和应用开发的基础。通过这两个核心模块的设计和实现可以了解Spring倡导的对企业应用开发所应秉持的思路,比如使用POJO开发企业应用,提供一致的编程模型,强调对接口编程等。对于这些Spring背后的开发思想和设计理念,大家都不会陌生,在Rod Johnson的经典著作中都有全面而深刻的讲解。作为参考,我们可以查看Spring官方网站对Spring项目的描述。如下图所示,Spring的目标和愿景写得很清楚。
首先,Spring的目标在于让Java EE的开发变得更容易,这就意味着Spring框架的使用也应该是容易的。对于开发人员而言,易用性是第一位的。为什么要让Java EE开发变得更容易,难道以前的Java EE开发很艰难?Spring究竟是如何让Java EE的开发变得更容易的呢?了解Java EE开发历史的读者都知道,正如Rod Johnson在他的著作《Expert One-on-One Java EE Design and Development》中提到的那样,EJB模型为Java EE开发引入了过度的复杂性,这个开发模型对Java EE的开发并不友好。有没有更好的开发模型呢?有,那就是基于POJO和简单的Java环境直接开发应用。这种开发模式,让Java洗净铅华,恢复自然风采。 使用POJO不仅能开发复杂的Java企业应用,还可以让Java EE开发在开发成本、开发周期、可维护性和性能上取得更大优势。对一般的企业应用需求而言,重要的是如何方便地使用应用所需要的服务,而不是各种各样的开发模型和模式。
Java语言自面世以来,以简洁而开放的特性,吸引了众多开发者、社区和商业公司的注意,从语言环境本身来看,它不但具有面向对象的语言特性,还具有跨平台的虚拟环境,使其在企业开发领域有独特的优势。但是,随着Java的发展,在开发企业应用时,有技术规范凌驾于应用需求的趋势,比如,在EJB的开发模式中,体现了技术规范实现的复杂性,但是对应用需求关注不足。在这个时候,Spring出现了,给人的第一印象是简洁而又具有丰富的内涵,就像第一次遇到Java一样,这种特质深深地吸引了开发者。Spring降低了企业应用开发的门槛,还原了POJO的本色,让开发者直接依赖于Java语言,直接依赖于面向对象编程,使用无所不在的单元测试来保证代码质量,使开发者有信心开发出高质量的企业应用。
我们如何才能既让开发变得容易,又能享受到Java EE提供的各种服务呢?Spring的目标就是通过自己的努力,让用户体会到这种简单之中的强大。同时,作为应用框架,Spring不想作为另外一种复杂开发模型的替代,也就是说不想用另一种复杂性去替代现有的复杂性,那是换汤不换药,并不能解决问题。这就意味着需要有新的突破。要解决这个问题,需要降低应用的负载和框架的侵入性,Spring是怎样做到这一点的呢?
Spring为我们提供的解决方案就是IoC容器和AOP支持。作为依赖反转模式的具体实现,IoC容器很好地降低了框架的侵入性,也可以认为依赖反转模式是Spring体现出来的核心模式。这些核心模式是软件架构设计中非常重要的因素,我们常常看到的MVC模式就是这样的核心模式。使用好这些核心模式,就像我们在Web应用中使用MVC模式一样,可以获得非常大的便利。
Spring核心的模式实现,是为应用提供IoC容器和AOP框架,从而在企业应用开发中引入新的核心模式,并使用户的开发方式发生很大的变化,具体来说,就是使用POJO来完成开发,在简化用户开发的同时,依然能够使用强大的服务,能够实现复杂的企业应用的开发需求。比如对于依赖反转,在Spring中,我们看到的就是,Java EE的服务都被抽象到IoC容器中,并通过AOP进行有效的封装,因为依赖注入的特性,这些复杂的依赖关系的管理被反转并被交给容器,使复杂的依赖关系管理从应用中解放出来了。
在Spring中,各个模块的依赖关系通过简单的IoC配置文件进行描述,使这些外部化的信息集中并且明了。我们在使用其他组件服务时,只需要去配置文件中了解和配置这些依赖关系即可,也就是说这里关心的是接口,至于服务的具体实现,在使用接口定义隔离开以后,并不是应用开发关心的重点。对应用开发而言,只需要了解服务的接口和依赖关系的配置即可。这样一来,可以很好地体现Spring的第二个信条:让应用开发对接口编程,而不是对类编程。这样POJO使用Java EE服务时,可以将对这些服务实现的依赖降到最低, 同时尽可能降低框架对应用的侵入性。
在处理与现有优秀解决方案的关系时,按照Spring的既定策略,它不会与第三方的解决方案进行竞争,而是致力于为应用提供使用优秀方案的集成平台。真正地把Spring定位在应用平台的地位,使Spring成为一个兼容并包的开放体系的同时,最大程度降低开发者对Spring API的依赖,这是怎样实现的呢?答案还是IoC容器和AOP技术,也就是说,Spring API在开发过程中并不是必须使用的。对具体的服务实现,Spring是开源软件和模块化的应用平台,虽然具体的服务是以Spring作为开发平台的,但是客户依然有很大的具体技术方案的选择权,可以根据应用自身的特点选择技术方案以支持应用需求的实现。IoC和AOP这两个核心组件,特别是IoC容器,是用户在使用Spring完成POJO应用开发的过程中必须使用的。这样的应用策略也极大地扩展了Spring的应用场合,不仅包括Java EE应用,还包括其他方面的应用,如桌面应用等。从这个意义上来讲,IoC容器称得上是Spring的最核心部分。