收藏 分享(赏)

SPRING开发指南.pdf

上传人:刘岱文 文档编号:5133 上传时间:2018-05-16 格式:PDF 页数:88 大小:711.53KB
下载 相关 举报
SPRING开发指南.pdf_第1页
第1页 / 共88页
SPRING开发指南.pdf_第2页
第2页 / 共88页
SPRING开发指南.pdf_第3页
第3页 / 共88页
SPRING开发指南.pdf_第4页
第4页 / 共88页
SPRING开发指南.pdf_第5页
第5页 / 共88页
点击查看更多>>
资源描述

1、 OpenDoc Series Spring 开发指南 V0.6 预览版 作者:夏昕 xiaxin(at) So many open source projects. Why not Open your Documents? J SpringFrameWork Developers Guide Version 0.6 September 2, 2004 So many open source projects. Why not Open your Documents? 文档说明 参与人员: 作者 联络 夏昕 xiaxin(at) (at) 为email 符号 发布记录 版本 日期 作者 说明

2、0.5 2004.6.1 夏昕 第一预览版 0.6 2004.9.1 夏昕 补充“持久层”内容。 OpenDoc版权说明 本文档版权归原作者所有。 在免费、且无任何附加条件的前提下,可在网络媒体中自由传播。 如需部分或者全文引用,请事先征求作者意见。 如果本文对您有些许帮助,表达谢意的最好方式,是将您发现的问题和文档改进意见及时反馈给作者。当然,倘若有时间和能力,能为技术群体无偿贡献自己的所学为最好的回馈。 另外,笔者近来试图就日本、印度的软件开发模式进行一些调研。如果诸位可以赠阅日本、印度软件研发过程中的需求、设计文档以供研究,感激不尽! SpringFrameWork Developers

3、 Guide Version 0.6 September 2, 2004 So many open source projects. Why not Open your Documents? Spring开发指南 前言 2003年年初,笔者在国外工作。其时,一位与笔者私交甚好的印度同事Paradeep从公司离职去斯坦福深造,临走送给笔者一本他最钟爱的书籍作为纪念。 工作间隙,时常见到他摩娑此书,摇头不止(印度人习惯和中国人相反,摇头代表肯定、赞同,相当于与中国人点头。笔者刚开始与印度同僚共事之时,每每组织项目会议,一屋子人频频摇头,让笔者倍感压力J)。 下班后,带着好友离职的失落,笔者夹着这本

4、书走在回家的路上,恰巧路过东海岸,天色依然明朗,随意坐上了海边一家酒吧的露天吧台,要了杯啤酒,随手翻弄着书的扉页,不经意看见书中遍布的钢笔勾画的线条。 “呵呵,Paradeep 这家伙,还真把这本书当回事啊”,一边笑着,一边摊开了此书,想看看到底是怎样的书让这样一个聪明老练的同事如此欣赏。 从此开始,这本书伴随笔者度过了整整一个月的业余时间. 这本书,也就是出自Rod Johnson的: Expert One-on-One J2EE Design and Development 此书已经由电子工业出版社出版,译版名为J2EE设计开发编程指南。 半年后,一个新的Java Framework发布,

5、同样出自Rod Johnson的手笔,这自然引起了笔者极大的兴趣,这就是SpringFramework。 SpringFramework 实际上是 Expert One-on-One J2EE Design and Development 一书中所阐述的设计思想的具体实现。在 One-on-One 一书中,Rod Johnson 倡导 J2EE 实用主义的设计思想,并随书提供了一个初步的开发框架实现(interface21 开发包)。而 SpringFramework 正是这一思想的更全面和具体的体现。Rod Johnson在interface21开发包的基础之上,进行了进一步的改造和扩充,使

6、其发展为一个更加开放、清晰、全面、高效的开发框架。 本文正是针对SpringFramework的开发指南,讲述了SpringFramework的设计思想以及在开发中的实际使用。同时穿插了一些笔者在项目实作中的经验所得。 SpringFrameWork Developers Guide Version 0.6 September 2, 2004 So many open source projects. Why not Open your Documents? Spring初探.5 准备工作.5 构建Spring基础代码.6 Spring 基础语义.12 Dependency Injection

7、.12 依赖注入的几种实现类型.14 Type1 接口注入.15 Type2 构造子注入.15 Type3 设值注入.15 几种依赖注入模式的对比总结.16 Spring Bean封装机制.17 Bean Wrapper.17 Bean Factory .18 ApplicationContext.21 Web Context.26 Spring 高级特性.27 Web应用与MVC.27 Spring MVC.28 Spring MVC指南.28 基于模板的Web表示层技术.42 Web应用中模板技术与JSP技术的对比.47 输入验证与数据绑定.49 异常处理.60 国际化支持.62 数据持久

8、层.66 事务管理.66 持久层封装.70 JDBC.70 Hibernate in Spring.78 ibatis in Spring .85 以下内容待整理后发布.88 远程调用.88 AOP.88 SpringFrameWork Developers Guide Version 0.6 September 2, 2004 So many open source projects. Why not Open your Documents? Spring初探 开始Spring研究之前,先让我们来看一个1分钟上手教程。 Quick Start! 准备工作 下载SpringFramework的

9、最新版本,并解压缩到指定目录。 在IDE中新建一个项目,并将Spring.jar将其相关类库加入项目。 笔者所用IDE为Eclipse,类库配置如下: Spring采用Apache common_logging,并结合Apache log4j作为日志输出组件。为了在调试过程中能观察到Spring的日志输出,在 CLASSPATH中新建log4j.properties配置文件,内容如下: log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdo

10、ut.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%c1 - %m%n 配置完成后,项目结构如下图所示: SpringFrameWork Developers Guide Version 0.6 September 2, 2004 So many open source projects. Why not Open your Documents? 构建Spring基础代码 示例基础代码包括: 1 Action接口: Action 接口定义了一个 execute 方法,在

11、我们示例中,不同的 Action 实现提供了各自的execute方法,以完成目标逻辑。 public interface Action public String execute(String str); 2 Action接口的两个实现UpperAction、LowerAction public class UpperAction implements Action private String message; public String getMessage() return message; public void setMessage(String string) message =

12、string; public String execute(String str) return (getMessage() + str).toUpperCase(); UpperAction将其message属性与输入字符串相连接,并返回其大写形式。 public class LowerAction implements Action private String message; SpringFrameWork Developers Guide Version 0.6 September 2, 2004 So many open source projects. Why not Open

13、your Documents? public String getMessage() return message; public void setMessage(String string) message = string; public String execute(String str) return (getMessage()+str).toLowerCase(); LowerAction将其message属性与输入字符串相连接,并返回其小写形式。 3 Spring配置文件(bean.xml) Spring Quick Start HeLLo (请确保配置bean.xml位于工作路径

14、之下,注意工作路径并不等同于CLASSPATH ,eclipse的默认工作路径为项目根路径,也就是.project文件所在的目录,而默认输出目录/bin是项目CLASSPATH的一部分,并非工作路径。) 4 测试代码 public void testQuickStart() ApplicationContext ctx=new FileSystemXmlApplicationContext(“bean.xml“); Action action = (Action) ctx.getBean(“TheAction“); System.out.println(action.execute(“Rod

15、Johnson“); 可以看到,上面的测试代码中,我们根据“bean.xml“创建了一个ApplicationContext实例,并从此实例中获取我们所需的Action实现。 SpringFrameWork Developers Guide Version 0.6 September 2, 2004 So many open source projects. Why not Open your Documents? 运行测试代码,我们看到控制台输出: HELLO ROD JOHNSON 我们将bean.xml中的配置稍加修改: 再次运行测试代码,看到: hello rod johnson 示例

16、完成! 很简单的示例,的确很简单,甚至简单到了不够真实。 不过,不知大家从这个最简单的例子中看出了什么? 真的只是打印输出了两行不痛不痒的问候语? 仔细观察一下上面的代码,可以看到: 1 我们的所有程序代码中(除测试代码之外),并没有出现Spring中的任何组件。 2 UpperAction和LowerAction的Message属性均由Spring通过读取配置文件(bean.xml)动态设置。 3 客户代码(这里就是我们的测试代码)仅仅面向接口编程,而无需知道实现类的具体名称。同时,我们可以很简单的通过修改配置文件来切换具体的底层实现类。 上面所说的这些,对于我们的实际开发有何帮助? 首先,

17、我们的组件并不需要实现框架指定的接口,因此可以轻松的将组件从Spring中脱离,甚至不需要任何修改(这在基于EJB框架实现的应用中是难以想象的)。 其次,组件间的依赖关系减少,极大改善了代码的可重用性。 Spring的依赖注入机制,可以在运行期为组件配置所需资源,而无需在编写组件代码时就加以指定,从而在相当程度上降低了组件之间的耦合。 上面的例子中,我们通过Spring,在运行期动态将字符串 “HeLLo” 注入到Action实现类的Message属性中。 现在假设我们回到传统的实现模式,应该如何处理? 一般的处理办法也就是编写一个Helper类(辅助类),完成配置文件读写功能,然后在各个Ac

18、tion的构造函数中,调用这个Helper类设置message属性值。 SpringFrameWork Developers Guide Version 0.6 September 2, 2004 So many open source projects. Why not Open your Documents? 此时,我们的组件就与这个Helper类库建立了依赖关系,之后我们需要在其他系统中重用这个组件的话,也必须连同这个Helper类库一并移植。实际开发中,依赖关系往往并非如此简单,组件与项目基层代码之间复杂的关联,使得组件重用性大大下降。 Spring通过依赖注入模式,将依赖关系从编码中

19、脱离出来,从而大大降低了组件之间的耦合,实现了组件真正意义上的即插即用。这也是Spring最具价值的特性之一。 面向接口编程。 诚然,即使没有Spring,实现面向接口的设计也不困难。Spring对于面向接口设计的意义,在于它为面向接口编程提供了一个更加自然的平台。基于Spring开发,程序员会自然而然倾向于使用接口来定义不同层次之间的关联关系,这种自发的倾向性,来自于Spring所提供的简单舒适的依赖注入实现。Spring使得接口的定义和使用不再像传统编码过程中那么繁琐(传统编码过程中,引入一个接口,往往也意味着同时要引入一个Factory类,也许还有一个额外的配置文件及其读写代码)。 既然

20、Spring给我们带来了如此这般的好处,那么,反过来,让我们试想一下,如果不使用Spring框架,回到我们传统的编码模式(也许正是目前的编码模式),情况会是怎样? 对于上例而言,我们需要怎样才能实现相同的功能? 上面的Action接口及其两个实现类UpperAction和LowerAction都与Spring无关,可以保留。而调用Action的测试代码,如果要实现同样的功能,应该如何编写? 首先,我们必须编写一个配置文件读取类,以实现Message属性的可配置化。 其次,得有一个Factory模式的实现,并结合配置文件的读写完成Action的动态加载。 于是,我们实现了一个ActionFact

21、ory来实现这个功能: public class ActionFactory public static Action getAction(String actionName) Properties pro = new Properties(); try pro.load(new FileInputStream(“config.properties“); String actionImplName = (String)pro.get(actionName); String actionMessage = (String)pro.get(actionName+“_msg“); Object ob

22、j = Class.forName(actionImplName).newInstance(); /BeanUtils是Apache Commons BeanUtils提供的辅助类 BeanUtils.setProperty(obj,“message“,actionMessage); SpringFrameWork Developers Guide Version 0.6 September 2, 2004 So many open source projects. Why not Open your Documents? return (Action)obj; catch (FileNotF

23、oundException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace(); catch (InstantiationException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (InvocationTargetException e) e.printStackTrace();

24、return null; 配置文件则采用最简单的properties文件形式: TheAction=net.xiaxin.spring.qs.UpperAction TheAction_msg=HeLLo 测试代码对应更改为: public void testFactory() Action action = ActionFactory.getAction(“TheAction“); System.out.println(action.execute(“Rod Johnson“); 且不论实现质量的好坏,总之通过上面新增的20来行代码,我们实现了类似的功能(如果不引入BeanUtils,而采用手工编写Reflection代码完成属性设置的话,显然代码将远远不止20行)。 好吧,现在有个新需求,这个ActionFactory每次都新建一个类的实例,这对系统性能不利,考虑到我们的两个Action都是线程安全的,修改一下ActionFactory,保持系统中只有一个Action实例供其他线程调用。 另外Action对象创建后,需要做一些初始化工作。修改一下ActionFactory,使其在创建Action实例之后,随即就调用Action.init方法执行初始化。

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 网络技术 > 后端技术

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报