版权与免责声明:本博客文章翻译自《Spring in action》第三版,原书版权归原作者及其出版单位所有,本人仅出于个人兴趣,翻译其中内容。本人不以盈利为目的,放置在博客中仅为了方便网友阅读原作遇到困难时参考。本人严正声明,本人并不拥有翻译该作品之正当权力,因此严禁他人转载,亦不保证作品之正确性;如侵犯您的权益,望告知,即行关闭。
翻译声明:本人目前计划每天翻译两页,且不做任何工期承诺,之前未在网上发现类似内容,如已有相似内容,望告知,也省得我翻译了。
Bean不是唯一的称呼…… 尽管Spring大量地使用单词bean和JavaBean来指代应用程序组件,但是不要望文生义地以为一个Spring组件就必须遵循JavaBeans规范。一个Spring组件可以是任何形式的POJO。在本书中,我采用广义上的JavaBean,即POJO的同义词。
纵览本书,你将发现,Spring神通广大。但是支撑Spring绝大部分功能的根基其实是少许基本理念,它们专注于Spring的基本任务:简化Java开发。
这是一份庄重的承诺!很多框架都声称简化这样或那样的事情,但是Spring致力于全方位地简化Java开发。这有待于细细解释。Spring是如何简化Java开发的?
为了降低Java的复杂性,Spring采取了以下四项核心策略:
· 采用普通简单Java对象(POJO)保持轻量级和最低限度侵入开发
· 通过依赖注入和面向接口降低耦合
· 通过切面和惯例进行声明式编程
· 通过切面和模板减少冗余
Spring所做的几乎一切事情都可以追溯到上述一个或多个策略。在本章的其他部分,我将对这些理念展开论述,并通过具体实例展现Spring是如何较好地兑现简化Java开发这一承诺的。我们先来看一看Spring是如何通过鼓励面向POJO开发来保持最低限度侵入的。
1.1.1 激发POJO的潜能
如果你是Java开发的老手,你或许见过(甚至使用过)这样的框架,它们强迫你去扩展它们提供的类,或实现它们的接口,从而将你紧紧束缚住。下面这个经典的示例,是EJB-2时代的无状态会话bean。从这个繁琐的HelloWorldBean中你可以发现,EJB2规范实在是太过于臃肿了。
package com.habuma.ejb.session; import javax.ejb.SessionBean; import javax.ejb.SessionContext; public class HelloWorldBean implements SessionBean { public void ejbActivate() { } public void ejbPassivate() { } public void ejbRemove() { } public void setSessionContext(SessionContext ctx) { } public String sayHello() { return "Hello World"; } public void ejbCreate() { } }
SessionBean接口允许你通过实现若干生命周期回调方法(这些方法以ejb打头),嵌入EJB的生命周期内。或许我应该这么说,SessionBean接口强迫你嵌入EJB的生命周期内,即便你不需要。HelloWorldBean中的大段代码仅仅是为了满足框架的需要。那么问题是:到底谁在为谁服务?
EJB2的侵入式特性并非特例。其他流行框架,比如Struts,WebWork和Tapestry的早期版本也都和其他简单Java类纠缠不清(imposed themselves upon otherwise simple Java classes)。这些重量级框架,强迫开发者编写混杂了冗余代码的类,这些类被束缚在框架之中,通常也很难编写相应的测试。
Spring竭力避免让你的应用程序代码与它的API相混杂。Spring几乎从不强制你实现一个Spring接口,或者扩展一个Spring类。事实上,基于Spring的应用程序中的类通常没有迹象显示它们正在被Spring所使用。最坏的情况下,一个类或许加注了Spring的注解,但它仍旧是一个POJO。
为了阐明这一点,如果清单1.1中展示的HelloWorldBean要被重写为Spring管理的bean,它看起来可能会是这样:
package com.habuma.spring; public class HelloWorldBean { public String sayHello() { return "Hello World"; } }
难道不是好得多吗?那些恼人的生命周期方法都不见了。HelloWorldBean没有实现、扩展或者导入任何Spring API的内容。HelloWorldBean是简练的,清晰的,总的来说,是一个普通简单Java对象。
POJO形式纵然简单,但功能可以非常强大。Spring强化POJO的方法之一就是使用依赖注入。让我们看看依赖注入是如何帮助应用程序的对象彼此解耦的。
1.1.2 注入依赖关系
依赖注入这个词让人望而生畏,它成为了一项复杂的编程技巧或设计模式的理念。但是事实证明,依赖注入(DI)并没有听上去那么复杂。