Spring通常被称为是构造Java工程的轻量级框架。这其中包含了两方面的内容:首先,你可以使用Spring构造各种Java工程,而不是像Apache的Struts那样,仅仅局限于Web工程。其次,所谓轻量级框架,并不是指类的数量或是工程的规模是轻量级的,用Spring的话说,轻量级就意味着更少的影响,你可以很容易的修改你的程序来获得Spring提供的各种好处,也可以很容易的从你的工程中去除Spring。当然,需要注意的是,这仅仅是指Spring的核心组件。Spring还提供了很多其它的组件,像数据访问等,使用这些组件,将使得你的工程与Spring框架形成耦合,但是,相比于你获得的好处而言,这些耦合根本算不得什么。
Spring框架的核心是基于控制反转(Invdersion Of Control, IOC)理论的,控制反转使得我们可以在外部来创建和管理组件之间的依赖关系。例如:类Foo依赖于一个Bar类型的实例来执行某些操作,传统的方式是,Foo使用new关键字或者从某个工厂类来创建一个Bar类的实例。然而,使用控制反转,一个Bar类型的实例将在运行时由外部程序提供。这种方式可以很形象的看作是在运行时,将依赖的组件实例注入到当前组件中。因此,在某些时候,控制反转也被称为依赖注入(Dependency Injection, DI)。在Spring中,你可以认为控制反转就等同于依赖注入。
依赖注入给我们带来的好处包括:
1.减少了组件关联的代码:你不再需要在组件内部自己创建需要使用的其它组件,它们会在运行时自动被注入进来,特别是当某些组件需要通过JNDI来获得,或是根本无法直接获得,例如远程资源时,DI带来的好处就更加明显了。
2.将依赖关系移到代码外:这会带来两点好处,首先,你可以在外部方便的管理组件间的依赖关系,而不需要重新编译代码。其次,你可以方便的切换某些依赖的实现类,例如将PostgreSQL的DAO实现切换为Oracle的DAO实现。
3.统一的依赖管理:传统的散布在工程各处的管理依赖关系的代码将不复存在,所有的依赖信息都集中在一个统一的地方,这使得维护变得容易,同时降低了发生错误的可能。
4.提高了可测试性:你可以很容易的替换依赖类的实现方式,如使用mock实现来代替真正的实现方式。假设我们需要测试业务对象(Business Object, BO),我们就可以使用mock实现来代替真正的DAO实现,从而避免真正地访问数据库,这大大提高了测试的效率。
5.遵循良好的设计方式:使用DI通常意味着遵循面向接口的设计方式。毫无疑问,面向接口是一种良好的设计方式。
Spring框架还包括了以下这些方面的内容:
1.面向方面的编程(Aspect Oriented Programming, AOP)
2.数据访问(Accessing Data in Spring)
3.事务管理(Managing Transactions)
4.简化J2EE的整合(Simplifying and Integrating with J2EE)
5.Web层的MVC框架(MVC in the Web Tier)
6.对远程访问的支持(Remoting Support)
7.邮件支持(Mail Support)
8.任务安排的支持(Job Scheduling Support)
9.简化的异常处理(Simplified Exception Handling)
10.源代码级的元数据(Source Level Metadata)