﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-happyfish-随笔分类-The Business Layer</title><link>http://www2.blogjava.net/happyfish/category/557.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 15:35:57 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 15:35:57 GMT</pubDate><ttl>60</ttl><item><title>(转)Spring学习笔记1 </title><link>http://www.blogjava.net/happyfish/archive/2005/03/02/1623.html</link><dc:creator>小鱼儿</dc:creator><author>小鱼儿</author><pubDate>Wed, 02 Mar 2005 14:50:00 GMT</pubDate><guid>http://www.blogjava.net/happyfish/archive/2005/03/02/1623.html</guid><wfw:comment>http://www.blogjava.net/happyfish/comments/1623.html</wfw:comment><comments>http://www.blogjava.net/happyfish/archive/2005/03/02/1623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyfish/comments/commentRss/1623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyfish/services/trackbacks/1623.html</trackback:ping><description><![CDATA[<H2><FONT color=#99cc00>1、概念理解</FONT> </H2>
<P>对Spring耳闻已久，但一直没有时间和心情去看它，最近它的声音是越来越大了，Java视线<A href="http://forum.javaeye.com/"><FONT color=#223355>http://forum.javaeye.com/</FONT></A>有不高手在谈论它。于是趁着有空闲时间，我也花了两个晚上看了看Spring，看的是夏昕的&lt;Spring开发指南&gt;http://www.xiaxin.net/Spring_Dev_Guide.rar，文章写得不错。以下谈谈我的学习感受</P>
<P><FONT color=#ccffcc><STRONG><FONT color=#66cc00>一、Spring的IoC(Inversion of Control)。</FONT></STRONG><BR></FONT>这是Spring中得有特点的一部份。IoC又被翻译成“控制反转”，也不知道是谁翻译得这么别扭，感觉很深奥的词。其实，原理很简单，用一句通俗的话来说：就是用XML来定义生成的对象。IoC其实是一种设计模式，Spring只是实现了这种设计模式。</P>
<P>这种设计模式是怎么来的呢？是实践中逐渐形成的。</P>
<P>第一阶段：用普通的无模式来写Java程序。一般初学者都要经过这个阶段。<BR>第二阶段：频繁的开始使用接口，这时，接口一般都会伴随着使用工厂模式。<BR>第三阶段：使用IoC模式。工厂模式还不够好：（1）因为的类的生成代码写死在程序里，如果你要换一个子类，就要修改工厂方法。（2）一个接口常常意味着一个生成工厂，会多出很多工厂类。<BR>&nbsp;&nbsp;&nbsp; 可以把IoC模式看做是工厂模式的升华，可以把IoC看作是一个大工厂，只不过这个大工厂里要生成的对象都是在XML文件中给出定义的，然后利用Java的“反射”编程，根据XML中给出的类名生成相应的对象。从实现来看，IoC是把以前在工厂方法里写死的对象生成代码，改变为由XML文件来定义，也就是把工厂和对象生成这两者独立分隔开来，目的就是提高灵活性和可维护性。</P>
<P>&nbsp;&nbsp;&nbsp; IoC中最基本的Java技术就是“反射”编程。反射又是一个生涩的名词，通俗的说反射就是根据给出的类名（字符串）来生成对象。这种编程方式可以让对象在生成时才决定要生成哪一种对象。我在最近的一个项目也用到了反射，当时是给出一个.properties文本文件，里面写了一些全类名（包名＋类名），然后，要根据这些全类名在程序中生成它们的对象。反射的应用是很广泛的，象Hibernate、String中都是用“反射”做为最基本的技术手段。</P>
<P>&nbsp;&nbsp;&nbsp; 在过去，反射编程方式相对于正常的对象生成方式要慢10几倍，这也许也是当时为什么反射技术没有普通应用开来的原因。但经SUN改良优化后，反射方式生成对象和通常对象生成方式，速度已经相差不大了（但依然有一倍以上的差距）。</P>
<P><BR>&nbsp;&nbsp;&nbsp; 所以要理解IoC，你必须先了解工厂模式和反射编程，否则对它产生的前因后果和实现原理都是无法理解透彻的。只要你理解了这一点，你自己也完全可以自己在程序中实现一个IoC框架，只不是这还要涉及到XML解析等其他知识，稍微麻烦一些。</P>
<P><BR>&nbsp;&nbsp;&nbsp; IoC最大的好处是什么？因为把对象生成放在了XML里定义，所以当我们需要换一个实现子类将会变成很简单（一般这样的对象都是现实于某种接口的），只要修改XML就可以了，这样我们甚至可以实现对象的热插拨（有点象USB接口和SCIS硬盘了）。</P>
<P>&nbsp;&nbsp;&nbsp; IoC最大的缺点是什么？（1）生成一个对象的步骤变复杂了（其实上操作上还是挺简单的），对于不习惯这种方式的人，会觉得有些别扭和不直观。（2）对象生成因为是使用反射编程，在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说，这点损耗是微不足道的，除非某对象的生成对效率要求特别高。（3）缺少IDE重构操作的支持，如果在Eclipse要对类改名，那么你还需要去XML文件里手工去改了，这似乎是所有XML方式的缺憾所在。</P>
<P>&nbsp;&nbsp;&nbsp; 总的来说IoC无论原理和实现都还算是很简单的。一些人曾认为IoC没什么实际作用，这种说法是可以理解的，因为如果你在编程中很少使用接口，或很少使用工厂模式，那么你根本就没有使用IoC的强烈需要，也不会体会到IoC可贵之处。有些人也说要消除工厂模式、单例模式，但是都语焉不详、人云亦云。但如果你看到IoC模式和用上Spring，那么工厂模式和单例模式的确基本上可以不用了。但它消失了吗？没有！Spring的IoC实现本身就是一个大工厂，其中也包含了单例对象生成方式，只要用一个设置就可以让对象生成由普通方式变单一实例方式，非常之简单。</P>
<P><STRONG><FONT color=#666699>&nbsp;&nbsp; 总结：<BR>&nbsp;&nbsp; （1）IoC原理很简单，作用的针对性也很强，不要把它看得很玄乎。<BR>&nbsp;&nbsp; （2）要理解IoC，首先要了解“工厂、接口、反射”这些概念。</FONT></STRONG></P>
<P><BR><STRONG><FONT color=#66cc00>二、Spring的MVC</FONT></STRONG></P>
<P>如果你已经熟悉Struts，那么不必把MVC做为重点学习内容。基本上我认为Spring&nbsp; MVC是一个鸡肋，它的技术上很先进，但易用性上没有Struts好。而且Struts有这么多年的基础了，Spring很难取代Struts的地位。这就是先入为主的优秀，一个项目经理选用一种框架，不能单纯的从它的技术上考虑，还有开发效率，人员配置等都是考虑因素。但做为研究性的学习，Spring的MVC部份还是蛮有价值的。</P>
<P><BR><STRONG><FONT color=#66cc00>三、数据库层的模板</FONT></STRONG><BR>Spring主要是提供了一些数据库模板（模板也是一种Java设计模式），让数据部分的代码更简洁，那些try...catch都可以不见了。这个的确是个好东东。</P>
<P><BR><STRONG><FONT color=#66cc00>四、AOP</FONT></STRONG></P>
<P>AOP又称面向方面编程，它的实现原理还是用了反射：通过对某一个种类的方法名做监控来实现统一处理。比如：监控以“insert”字符串开头的方法名，在这种方法执行的前后进行某种处理（数据库事务等）。但这里我有一个疑问？不一定所有以insert开头的方法都是数据库操作，哪么当某个insert开头的方法不是数据库操作，你又对它进行了数据事务的操作，这样的错误如何防止？？？我对这方面了解不深，还是只知道一个大概。</P>
<P><BR>曾看过一个程序员发出这样的感慨：“框架一个接一个，学也学不完，而且有必要吗？这样一层层的加上框架，还不如直接写JSP来得直接，效率还高”。我想这种困惑很多人都有吧？但如果你经过的项目渐多，就会发现，维护项目要比开发项目更艰难，代价更大。那种用JSP直接来写，层次又不清楚的开发，往往最后得到一个不可再修改的软件，一团乱麻，移一发而动全身。但软件不象电视机，做好了就不会改动了，软件是一个变化的事物，用户的需求随时会改变，这时你会体会到分层和使用框架的好处了，它们为你做了软件中很多和业务无关的工作，你可以只关注业务，并减少代码量。唯一缺点就是有一个学习的代价，框架配置上也较麻烦。</P>
<P><BR>学习框架，我认为应该：第一步，了解这个框架中的一些关键概念，它的具体含义是什么。第二步，了解这个框架的精华在哪里，它能对开发起到什么样的作用，最好能对它的原理有一定的了解。第三步，用这个框架来写几个例子，实际体会一下。我现在还是刚刚大概完成了前两步，这几天会再看看Spring的文档并用Spring写几个例子，到时一起发出来。</P>
<P>另外，很赞赏&lt;Spring开发指南&gt;的作者夏昕的观点，将自已的经验写成文档公开出来，不过一个人的力量终究太弱。最好能够形成一个组织，对一种新技术，由一两个人出一个大纲，大家把它分了，更写一章，然后由两三个人总集起。我个人感觉，由于英文语言的关系，新技术引进到国内的还是太慢了，至少要比国外慢上一年以上，成立一个开源文档组织还是很有意义的事。</P><img src ="http://www.blogjava.net/happyfish/aggbug/1623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyfish/" target="_blank">小鱼儿</a> 2005-03-02 22:50 <a href="http://www.blogjava.net/happyfish/archive/2005/03/02/1623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)Spring的下载和安装 </title><link>http://www.blogjava.net/happyfish/archive/2005/03/02/1622.html</link><dc:creator>小鱼儿</dc:creator><author>小鱼儿</author><pubDate>Wed, 02 Mar 2005 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/happyfish/archive/2005/03/02/1622.html</guid><wfw:comment>http://www.blogjava.net/happyfish/comments/1622.html</wfw:comment><comments>http://www.blogjava.net/happyfish/archive/2005/03/02/1622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyfish/comments/commentRss/1622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyfish/services/trackbacks/1622.html</trackback:ping><description><![CDATA[<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">下载主页</SPAN><SPAN lang=EN-US><A href="http://www.springframework.org/download.html"><FONT color=#223355>http://www.springframework.org/download.html</FONT></A> </SPAN><SPAN style="FONT-FAMILY: 宋体">，或者直接使用链接地址：</SPAN><SPAN lang=EN-US><A href="http://voxel.dl.sourceforge.net/sourceforge/springframework/spring-framework-1.1.4-with-dependencies.zip"><FONT color=#223355>http://voxel.dl.sourceforge.net/sourceforge/springframework/spring-framework-1.1.4-with-dependencies.zip</FONT></A></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>Spring</SPAN><SPAN style="FONT-FAMILY: 宋体">的下载包有两种：</SPAN><SPAN lang=EN-US>spring-framework-1.1.4-with-dependencies.zip</SPAN><SPAN style="FONT-FAMILY: 宋体">和</SPAN><SPAN lang=EN-US>spring-framework-1.1.4.zip</SPAN><SPAN style="FONT-FAMILY: 宋体">，上面的第二个链接就是下载前者，建议你也下载前者，因为前者比后者多了一些</SPAN><SPAN lang=EN-US>Spring</SPAN><SPAN style="FONT-FAMILY: 宋体">要用到的第三方包，如</SPAN><SPAN lang=EN-US>hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体">、</SPAN><SPAN lang=EN-US>j2ee</SPAN><SPAN style="FONT-FAMILY: 宋体">、</SPAN><SPAN lang=EN-US>dom4j</SPAN><SPAN style="FONT-FAMILY: 宋体">、</SPAN><SPAN lang=EN-US>aopalliance</SPAN><SPAN style="FONT-FAMILY: 宋体">、</SPAN><SPAN lang=EN-US>jakarta-commons</SPAN><SPAN style="FONT-FAMILY: 宋体">等。下载包名称的</SPAN><SPAN lang=EN-US>dependencies</SPAN><SPAN style="FONT-FAMILY: 宋体">就是“依赖”的意思。</SPAN></P>
<H3><SPAN lang=EN-US>1、解压后的目录结构如下：</SPAN></H3>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US><IMG height=321 alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image001.jpg" width=286 border=0></SPAN></P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">目录说明：</SPAN></P>
<P class=Char><SPAN lang=EN-US style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>dist&nbsp; Spring</SPAN><SPAN style="FONT-FAMILY: 宋体">自已的核心库</SPAN></P>
<P class=Char><SPAN lang=EN-US style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>docs&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-FAMILY: 宋体">有一些文档。</SPAN></P>
<P class=Char><SPAN lang=EN-US style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>lib&nbsp;&nbsp; </SPAN><SPAN style="FONT-FAMILY: 宋体">是一些用到的第三方库。</SPAN></P>
<P class=Char><SPAN lang=EN-US style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>mock&nbsp; </SPAN><SPAN style="FONT-FAMILY: 宋体">仿制品？？？？？？？？？？？？？我也不知道</SPAN></P>
<P class=Char><SPAN lang=EN-US style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>samples </SPAN><SPAN style="FONT-FAMILY: 宋体">一些项目例子</SPAN></P>
<P class=Char><SPAN lang=EN-US style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>src&nbsp; Spring</SPAN><SPAN style="FONT-FAMILY: 宋体">的源代码</SPAN></P>
<P class=Char><SPAN lang=EN-US style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>test&nbsp; </SPAN><SPAN style="FONT-FAMILY: 宋体">测试用例</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 0cm"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<H3><SPAN lang=EN-US>2、新建一个Eclipse项目</SPAN></H3>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN style="FONT-FAMILY: 宋体">（</SPAN><SPAN lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体">）项目名</SPAN><SPAN lang=EN-US>myspring</SPAN></P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US><IMG height=462 alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image002.jpg" width=500 border=0></SPAN></P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN style="FONT-FAMILY: 宋体">（</SPAN><SPAN lang=EN-US>2</SPAN><SPAN style="FONT-FAMILY: 宋体">）直接单击“下一步”，再单击“完成”</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN style="FONT-FAMILY: 宋体">（</SPAN><SPAN lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 宋体">）在项目下创建一个</SPAN><SPAN lang=EN-US>lib</SPAN><SPAN style="FONT-FAMILY: 宋体">目录</SPAN></P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US><IMG height=121 alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image003.jpg" width=253 border=0></SPAN></P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN style="FONT-FAMILY: 宋体">（</SPAN><SPAN lang=EN-US>4</SPAN><SPAN style="FONT-FAMILY: 宋体">）将</SPAN><SPAN lang=EN-US>Spring</SPAN><SPAN style="FONT-FAMILY: 宋体">的解压缩目录</SPAN><SPAN lang=EN-US>dist</SPAN><SPAN style="FONT-FAMILY: 宋体">和</SPAN><SPAN lang=EN-US>lib</SPAN><SPAN style="FONT-FAMILY: 宋体">都复制到这个</SPAN><SPAN lang=EN-US>lib</SPAN><SPAN style="FONT-FAMILY: 宋体">目录中，然后前者改名成</SPAN><SPAN lang=EN-US>spring</SPAN><SPAN style="FONT-FAMILY: 宋体">，后者先暂时不动吧，以后用到时才管它。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 0cm"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<H3><SPAN lang=EN-US>3、将spring库加入到库引用</SPAN></H3>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">将</SPAN><SPAN lang=EN-US>spring</SPAN><SPAN style="FONT-FAMILY: 宋体">库加入到库引用中，有如下两种方法。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN style="FONT-FAMILY: 宋体">方法一：单击“添加</SPAN><SPAN lang=EN-US>JAR</SPAN><SPAN style="FONT-FAMILY: 宋体">”把</SPAN><SPAN lang=EN-US>spring</SPAN><SPAN style="FONT-FAMILY: 宋体">的核心包加入。</SPAN></P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US><IMG height=438 alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image004.jpg" width=438 border=0></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 0cm"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN style="FONT-FAMILY: 宋体">方法二：上面的“方法一”简单易行，但如果一个项目要引入的包种类很多，那么就显示得较乱。还有一种操作麻烦，但较清晰一些的方法。这种方法是使用</SPAN><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体">中的“用户库”的方式，如下图所示：</SPAN></P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US><IMG height=456 alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image005.jpg" width=553 border=0></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 0cm"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US><IMG height=397 alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image006.jpg" width=554 border=0></SPAN></P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US><IMG height=514 alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image007.jpg" width=553 border=0></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 0cm"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN style="FONT-FAMILY: 宋体">最后的结果如下图所示，然后单击“确定”</SPAN></P><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 黑体"><BR style="PAGE-BREAK-BEFORE: always" clear=all></SPAN>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US><IMG height=383 alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image008.jpg" width=553 border=0></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 0cm"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN style="FONT-FAMILY: 宋体">返回上一界面后，再单击“完成”，得到如下图所示的效果</SPAN></P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US><IMG height=456 alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image009.jpg" width=553 border=0></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 0cm"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN style="FONT-FAMILY: 宋体">最后，项目里的</SPAN><SPAN lang=EN-US>spring</SPAN><SPAN style="FONT-FAMILY: 宋体">包的引用都在一个目录下，显示层次感强很多。</SPAN></P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US><IMG height=315 alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image010.jpg" width=288 border=0></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 0cm"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">以后如果要引入</SPAN><SPAN lang=EN-US>myspring/lib/lib</SPAN><SPAN style="FONT-FAMILY: 宋体">目录下的第三方包，也按方法二较好：将第三方包的目录复制到</SPAN><SPAN lang=EN-US>myspring/lib</SPAN><SPAN style="FONT-FAMILY: 宋体">下，再参照方法二，将其加入库引用中即可</SPAN></P>
<H3><SPAN lang=EN-US>4、设置日志包的库引用</SPAN></H3>
<P class=MsoNormal><SPAN lang=EN-US>jakarta-commons</SPAN><SPAN style="FONT-FAMILY: 宋体">和</SPAN><SPAN lang=EN-US>log4j</SPAN><SPAN style="FONT-FAMILY: 宋体">包主要是做为</SPAN><SPAN lang=EN-US>Spring</SPAN><SPAN style="FONT-FAMILY: 宋体">的运行时输出</SPAN><SPAN lang=EN-US>log</SPAN><SPAN style="FONT-FAMILY: 宋体">（日志）用，如果不设置日志包，那么日志就没法输出到控制台，不利于开发和调试。设置方式如下：</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN style="FONT-FAMILY: 宋体">（</SPAN><SPAN lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体">）就照上面的方法，放</SPAN><SPAN lang=EN-US>myspring/lib/lib</SPAN><SPAN style="FONT-FAMILY: 宋体">目录下的</SPAN><SPAN lang=EN-US>log4j</SPAN><SPAN style="FONT-FAMILY: 宋体">目录和</SPAN><SPAN lang=EN-US>jakarta-commons</SPAN><SPAN style="FONT-FAMILY: 宋体">目录往上移一层到</SPAN><SPAN lang=EN-US>myspring/lib</SPAN><SPAN style="FONT-FAMILY: 宋体">目录下。最后设置的结果如下图所示，这里我们把</SPAN><SPAN lang=EN-US>log4j</SPAN><SPAN style="FONT-FAMILY: 宋体">移到了</SPAN><SPAN lang=EN-US>others</SPAN><SPAN style="FONT-FAMILY: 宋体">目录，因为</SPAN><SPAN lang=EN-US>log4j</SPAN><SPAN style="FONT-FAMILY: 宋体">就一个</SPAN><SPAN lang=EN-US>JAR</SPAN><SPAN style="FONT-FAMILY: 宋体">包，专门为它象</SPAN><SPAN lang=EN-US>jakarta-commons</SPAN><SPAN style="FONT-FAMILY: 宋体">创建一个目录和用户库太不值了，以后可能还会有这种引用单个包的时候，到时都放到</SPAN><SPAN lang=EN-US>others</SPAN><SPAN style="FONT-FAMILY: 宋体">目录里好了。</SPAN><SPAN lang=EN-US> </SPAN></P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US><IMG height=619 alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image011.jpg" width=513 border=0></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN style="FONT-FAMILY: 宋体">（</SPAN><SPAN lang=EN-US>2</SPAN><SPAN style="FONT-FAMILY: 宋体">）日志的库引用完成之后，还要创建一个日志的配置文件：</SPAN><SPAN lang=EN-US>log4j.properties</SPAN><SPAN style="FONT-FAMILY: 宋体">，其文件内容如下：</SPAN></P>
<DIV style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #fff0e1; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<P class=a0><SPAN lang=EN-US>log4j.rootLogger=DEBUG, stdout</SPAN></P>
<P class=a0><SPAN lang=EN-US>log4j.appender.stdout=org.apache.log4j.ConsoleAppender</SPAN></P>
<P class=a0><SPAN lang=EN-US>log4j.appender.stdout.layout=org.apache.log4j.PatternLayout</SPAN></P>
<P class=a0><SPAN lang=EN-US>log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n</SPAN></P></DIV>
<P class=MsoNormal style="TEXT-INDENT: 0cm"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN lang=EN-US>log4j.properties</SPAN><SPAN style="FONT-FAMILY: 宋体">文件的创建位置在</SPAN><SPAN lang=EN-US>src</SPAN><SPAN style="FONT-FAMILY: 宋体">目录下，如下图所示：</SPAN></P>
<P class=a style="TEXT-INDENT: 20pt"><SPAN lang=EN-US><IMG height=148 alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image012.jpg" width=258 border=0></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 0cm"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN style="FONT-FAMILY: 宋体">如果没有设置日志设置或设置不对，在使用控制台时会出现下面所示的红字。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 20pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: red; FONT-FAMILY: 宋体">java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory</SPAN></P><BR><img src ="http://www.blogjava.net/happyfish/aggbug/1622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyfish/" target="_blank">小鱼儿</a> 2005-03-02 22:49 <a href="http://www.blogjava.net/happyfish/archive/2005/03/02/1622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>