Spring可以做的事情非常多。但归根结底,支撑Spring的仅仅是少许的基本理念,所有的理念都可以追溯到Spring最根本的使命上:简化Java开发
为了降低Java开发复杂性,Spring采取了以下4种关键策略:
- 基于POJO的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和惯例进行声明式编程;
- 通过切面和模板减少样板式代码。
几乎Spring所做的任何事情都可以追溯到上述的一条或多条侧率。
1. 激发POJO的潜能
Spring竭力避免因自身的API而弄乱你的应用代码。Spring不会强迫你实现Spring规范的接口或继承Spring规范的类,相反,在基于Spring构建的应用中,它的类通常没有任何痕迹表明你使用了Spring。最坏的场景是,一个类或许会使用Spring注解,但它依旧是POJO。
2. 依赖注入
任何一个有实际意义的应用都会有两个或更多的类组成,这些类相互之间进行协作来完成特定的业务逻辑。按照传统的做法,每个对象负责管理与自己相互协作的对象(即他所依赖的对象)的引用,这将会导致高度耦合和难以测试的代码。
通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系,依赖关系将被自动注入到需要它们的对象当中去。
如果一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。
创建应用组件之间协作的行为通常被称为装配(wiring)。Spring有多种装配bean的方式,采用XML是很常见的一种装配方式。
Spring通过应用上下文(Application Context)装载bean的定义并把他们组装起来。Spring应用上下文全权负责对象的创建和组装。Spring自带了多种应用上下文的实现,他们之间的主要区别仅仅在于如何加载配置。
3. 应用切面
DI能够让相互协作的软件构件保持松散耦合,而面向切面编程(aspect-oriented programming, AOP)允许你吧遍布应用各处的功能分离出来形成可重用的组件。
面向切面编程往往被定义为促使软件系统实现关注点分离的一项技术。系统由许多不同的组件组成,每个组件各负责一块特定功能。除了实现自身核心的功能外,这些组件还经常承担着额外的职责。诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为他们会跨越系统的多个组件。
如果将这些关注点分离到多个组件中去,你的代码会带来双重的复杂性。
- 实现系统关注点功能的代码将会重复出现在多个组件中。
- 组件会因为那些与自身核心义务无关的代码而变得混乱。
AOP能够使这些关注点(如日志、安全控制、事务等)服务化,并以声明的方式将他它们应用到它们需要影响的组件中去,从而使这些组件具有更高的内聚性并且更加关注自身的业务。
4. 使用模板消除样板式代码
Spring旨在通过模板封装来消除样板式代码。
如:Spring的JdbcTemplate使得执行数据库操作时,避免传统的JDBC样板式代码成为了可能。