??xml version="1.0" encoding="utf-8" standalone="yes"?> 对Spring耳闻已久Q但一直没有时间和心情ȝ它,最q它的声x来大了,Java视线http://forum.javaeye.com/有不高手在谈论它。于是趁着有空闲时_我也׃两个晚上看了看SpringQ看的是夏昕?lt;Spring开发指?gt;http://www.xiaxin.net/Spring_Dev_Guide.rarQ文章写得不错。以下谈谈我的学习感?/P>
一、Spring的IoC(Inversion of Control)?/FONT> q种设计模式是怎么来的呢?是实践中逐渐形成的?/P>
W一阶段Q用普通的无模式来写JavaE序。一般初学者都要经q这个阶Dc?BR>W二阶段Q频J的开始用接口,q时Q接口一般都会伴随着使用工厂模式?BR>W三阶段Q用IoC模式。工厂模式还不够好:Q?Q因为的cȝ生成代码写死在程序里Q如果你要换一个子c,p修改工厂Ҏ。(2Q一个接口常常意味着一个生成工厂,会多出很多工厂类?BR> 可以把IoC模式看做是工厂模式的升华Q可以把IoC看作是一个大工厂Q只不过q个大工厂里要生成的对象都是在XML文g中给出定义的Q然后利用Java的“反”编E,ҎXML中给出的cd生成相应的对象。从实现来看QIoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文g来定义,也就是把工厂和对象生成这两者独立分隔开来,目的是提高灉|性和可维护性?/P>
IoC中最基本的Java技术就是“反”编E。反又是一个生涩的名词Q通俗的说反射是Ҏl出的类名(字符Ԍ来生成对象。这U编E方式可以让对象在生成时才决定要生成哪一U对象。我在最q的一个项目也用到了反,当时是给Z?properties文本文gQ里面写了一些全cdQ包名+cdQ,然后Q要Ҏq些全类名在E序中生成它们的对象。反的应用是很q泛的,象Hibernate、String中都是用“反”做为最基本的技术手Dc?/P>
在过去,反射~程方式相对于正常的对象生成方式要慢10几倍,q也怹是当时ؓ什么反技术没有普通应用开来的原因。但lSUN改良优化后,反射方式生成对象和通常对象生成方式Q速度已经相差不大了(但依然有一倍以上的差距Q?/P>
IoC最大的~点是什么?Q?Q生成一个对象的步骤变复杂了Q其实上操作上还是挺单的Q,对于不习惯这U方式的人,会觉得有些别扭和不直观。(2Q对象生成因为是使用反射~程Q在效率上有些损耗。但相对于IoC提高的维护性和灉|性来_q点损耗是微不道的,除非某对象的生成Ҏ率要求特别高。(3Q缺IDE重构操作的支持,如果在Eclipse要对cL名,那么你还需要去XML文g里手工去改了Q这g是所有XML方式的缺憾所在?/P>
ȝ来说IoC无论原理和实现都q算是很单的。一些h曾认为IoC没什么实际作用,q种说法是可以理解的Q因为如果你在编E中很少使用接口Q或很少使用工厂模式Q那么你Ҏ没有用IoC的强烈需要,也不会体会到IoC可贵之处。有些h也说要消除工厂模式、单例模式,但是都语焉不详、h云亦云。但如果你看到IoC模式和用上SpringQ那么工厂模式和单例模式的确基本上可以不用了。但它消׃吗?没有QSpring的IoC实现本n是一个大工厂Q其中也包含了单例对象生成方式,只要用一个设|就可以让对象生成由普通方式变单一实例方式Q非怹单?/P>
ȝQ?BR> Q?QIoC原理很简单,作用的针Ҏ也很强Q不要把它看得很玄乎?BR> Q?Q要理解IoCQ首先要了解“工厂、接口、反”这些概c?/FONT> 如果你已l熟悉StrutsQ那么不必把MVC做ؓ重点学习内容。基本上我认为Spring MVC是一个鸡肋,它的技术上很先q,但易用性上没有Struts好。而且Struts有这么多q的基础了,Spring很难取代Struts的地位。这是先入Z的优UQ一个项目经理选用一U框Ӟ不能单纯的从它的技术上考虑Q还有开发效率,人员配置{都是考虑因素。但做ؓ研究性的学习QSpring的MVC部䆾q是蛮有价值的?/P>
AOP又称面向斚w~程Q它的实现原理还是用了反:通过Ҏ一个种cȝҎ名做监控来实现统一处理。比如:监控以“insert”字W串开头的Ҏ名,在这U方法执行的前后q行某种处理Q数据库事务{)。但q里我有一个疑问?不一定所有以insert开头的Ҏ都是数据库操作,哪么当某个insert开头的Ҏ不是数据库操作,你又对它q行了数据事务的操作Q这L错误如何防止Q?Q我对这斚w了解不深Q还是只知道一个大概?/P>
另外Q很赞赏<Spring开发指?gt;的作者夏昕的观点Q将自已的经验写成文公开出来Q不q一个h的力量终I太弱。最好能够Ş成一个组l,对一U新技术,׃两个人出一个大UԌ大家把它分了Q更写一章,然后׃三个人总集赗我个h感觉Q由于英文语a的关p,新技术引q到国内的还是太慢了Q至要比国外慢上一q以上,成立一个开源文档组l还是很有意义的事?/P>
q是Spring中得有特点的一部䆾。IoC又被译成“控制反转”,也不知道是谁译得这么别扭,感觉很深奥的词。其实,原理很简单,用一句通俗的话来说Q就是用XML来定义生成的对象。IoC其实是一U设计模式,Spring只是实现了这U设计模式?/P>
所以要理解IoCQ你必须先了解工厂模式和反射~程Q否则对它生的前因后果和实现原理都是无法理解透彻的。只要你理解了这一点,你自׃完全可以自己在程序中实现一个IoC框架Q只不是q还要涉及到XML解析{其他知识,E微ȝ一些?/P>
IoC最大的好处是什么?因ؓ把对象生成放在了XML里定义,所以当我们需要换一个实现子cd会变成很单(一般这L对象都是现实于某U接口的Q,只要修改XML可以了Q这h们甚臛_以实现对象的热插拨(有点象USB接口和SCIS盘了)?/P>
二、Spring的MVC
三、数据库层的模板
Spring主要是提供了一些数据库模板Q模板也是一UJava设计模式Q,让数据部分的代码更简z,那些try...catch都可以不见了。这个的是个好东东?/P>
四、AOP
曄q一个程序员发出q样的感慨:“框架一个接一个,学也学不完,而且有必要吗Q这样一层层的加上框Ӟq不如直接写JSP来得直接Q效率还高”。我惌U困惑很多h都有吧?但如果你l过的项目渐多,׃发现Q维护项目要比开发项目更艰难Q代h大。U用JSP直接来写Q层ơ又不清楚的开发,往往最后得C个不可再修改的YӞ一团ؕ麻,UM发而动全n。但软g不象电视机,做好了就不会改动了,软g是一个变化的事物Q用L需求随时会改变Q这时你会体会到分层和用框架的好处了,它们Z做了软g中很多和业务无关的工作,你可以只x业务Qƈ减少代码量。唯一~点是有一个学习的代hQ框枉|上也较ȝ?/P>
学习框架Q我认ؓ应该Q第一步,了解q个框架中的一些关键概念,它的具体含义是什么。第二步Q了解这个框架的_֍在哪里,它能对开发vC么样的作用,最好能对它的原理有一定的了解。第三步Q用q个框架来写几个例子Q实际体会一下。我现在q是刚刚大概完成了前两步Q这几天会再看看Spring的文ƈ用Spring写几个例子,到时一起发出来?/P>
Spring的下载包有两U:spring-framework-1.1.4-with-dependencies.zip?/SPAN>spring-framework-1.1.4.zipQ上面的W二个链接就是下载前者,你也下蝲前者,因ؓ前者比后者多了一?/SPAN>Spring要用到的W三方包Q如hibernate?/SPAN>j2ee?/SPAN>dom4j?/SPAN>aopalliance?/SPAN>jakarta-commons{。下载包名称?/SPAN>dependencies是“依赖”的意思?/SPAN>
目录说明Q?/SPAN>
l dist Spring自已的核心库
l docs 有一些文?/SPAN>
l lib 是一些用到的W三方库?/SPAN>
l mock 仿制品?Q?Q?Q?Q?Q?Q?我也不知?/SPAN>
l samples 一些项目例?/SPAN>
l src Spring的源代码
l test 试用例
Q?/SPAN>1Q项目名myspring
Q?/SPAN>2Q直接单几Z下一步”,再单几Z完成?/SPAN>
Q?/SPAN>3Q在目下创Z?/SPAN>lib目录
Q?/SPAN>4Q将Spring的解压羃目录dist?/SPAN>lib都复制到q个lib目录中,然后前者改名成springQ后者先暂时不动吧,以后用到时才它?/SPAN>
?/SPAN>spring库加入到库引用中Q有如下两种Ҏ?/SPAN>
Ҏ一Q单几Z添?/SPAN>JAR”把spring的核心包加入?/SPAN>
Ҏ二:上面的“方法一”简单易行,但如果一个项目要引入的包U类很多Q那么就昄得较乱。还有一U操作麻烦,但较清晰一些的Ҏ。这U方法是使用Eclipse中的“用户库”的方式Q如下图所C:
最后的l果如下图所C,然后单击“确定?/SPAN>
q回上一界面后,再单几Z完成”,得到如下图所C的效果
最后,目里的spring包的引用都在一个目录下Q显C层ơ感强很多?/SPAN>
以后如果要引?/SPAN>myspring/lib/lib目录下的W三方包Q也按方法二较好Q将W三方包的目录复制到myspring/lib下,再参照方法二Q将其加入库引用中即?/SPAN>
jakarta-commons?/SPAN>log4j包主要是做ؓSpring的运行时输出logQ日志)用,如果不设|日志包Q那么日志就没法输出到控制台Q不利于开发和调试。设|方式如下:
Q?/SPAN>1Q就照上面的ҎQ放myspring/lib/lib目录下的log4j目录?/SPAN>jakarta-commons目录往上移一层到myspring/lib目录下。最后设|的l果如下图所C,q里我们?/SPAN>log4jUd?/SPAN>others目录Q因?/SPAN>log4j׃?/SPAN>JAR包,专门为它?/SPAN>jakarta-commons创徏一个目录和用户库太不gQ以后可能还会有q种引用单个包的时候,到时都放?/SPAN>others目录里好了?/SPAN>
Q?/SPAN>2Q日志的库引用完成之后,q要创徏一个日志的配置文gQ?/SPAN>log4j.propertiesQ其文g内容如下Q?/SPAN>
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n
log4j.properties文g的创Z|在src目录下,如下图所C:
如果没有讄日志讄或设|不对,在用控制台时会出现下面所C的U字?/SPAN>
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory