﻿<?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-潘潘.eagle-随笔分类-JAVA</title><link>http://www.blogjava.net/zhenxuanpan/category/48420.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 09 Feb 2012 03:37:04 GMT</lastBuildDate><pubDate>Thu, 09 Feb 2012 03:37:04 GMT</pubDate><ttl>60</ttl><item><title>Liquibase+spring 初步使用</title><link>http://www.blogjava.net/zhenxuanpan/archive/2012/02/09/369631.html</link><dc:creator>潘潘.eagle</dc:creator><author>潘潘.eagle</author><pubDate>Wed, 08 Feb 2012 16:09:00 GMT</pubDate><guid>http://www.blogjava.net/zhenxuanpan/archive/2012/02/09/369631.html</guid><wfw:comment>http://www.blogjava.net/zhenxuanpan/comments/369631.html</wfw:comment><comments>http://www.blogjava.net/zhenxuanpan/archive/2012/02/09/369631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhenxuanpan/comments/commentRss/369631.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhenxuanpan/services/trackbacks/369631.html</trackback:ping><description><![CDATA[<div>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">现在的工作的项目中用了liquibase，感觉挺爽的，可以跟踪、管理数据库的重构。这对于很多需求变更较大的项目是非常不错的，特别是互联网的项目。（虽然互联网Nosql已经非常流行，不过俺觉得传统关系型数据库还是有存在的必要的）</span></p>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">好了，废话不多说，说说这几天的学习心得和实战总结。</span></p>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">关于liquibase的优点就不多说了，可以去官网看简介。</span></p>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">基本上我是从quickStart开始看的。Liquibase的原理很简单，就是通过记录数据库的结构方面的所有重构都放在一个Changelog中的xml中，通过xml的changeSet去跟踪数据库的变更。</span></p>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">在最近的工作中很好奇，为什么liquibase可以做到识别哪一个ChangeSet需要去对数据库重构，哪一个不重构（已经执行了数据库结构的修改操作）。通过测试以后发现，liquibase第一次运行的时候会在DB建立两张表，分别是databasechangelog和databasechagneloglock：<br />
</span></p>
<div>
<p style="margin-bottom: 0pt; margin-top: 0pt; "><img src="http://www.blogjava.net/images/blogjava_net/zhenxuanpan/图片1.jpg" width="203" height="97" alt="" /><br />
</p>
<div>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">这样就很好理解了，通过DB去继续并匹配旧的操作和新的操作。</span></p>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10.5pt; font-family: 宋体; ">继续看databasechange表结构，就发现表结构的主键是ID,AUTHOR,FILENAME.<br />
<img src="http://www.blogjava.net/images/blogjava_net/zhenxuanpan/图片2.jpg" width="505" height="292" alt="" /><br />
</span></p>
<div>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">即通过每一个ChangeSet的ID+修改ChangeSet的作者标示+包含ChangeSet的文件名</span></p>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">来，也这避免了多人协同开发的冲突。（关于ID和AUTHOR可以再后面配置文件中看到）</span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; font-family: 宋体; ">关于databasechangelog，我的理解则是当年是否有操作占有数据库变更的锁<br />
<img src="http://www.blogjava.net/images/blogjava_net/zhenxuanpan/图片3.jpg" width="498" height="143" alt="" /><br />
</span></p>
<div>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">Ps：开始认为这个ID和databasechange的ID应该是同一个值，后来才发现不同，因为属性值不同，这里的ID应该是databasechange表中的ORDEREXECUTED。这个值应该是数据库根据执行顺序确定的序列号而不是用户在xml中配置的ID号。</span></p>
<p style="margin-bottom:0pt; margin-top:0pt; "></p>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">看完这些，就来看看liquibase怎么在项目中使用，</span></p>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">吐槽一下，官方的quickStart写的有点烂，只列了如下几种：<br />
<img src="http://www.blogjava.net/images/blogjava_net/zhenxuanpan/图片4.jpg" width="416" height="39" alt="" /><br />
</span></p>
<div>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">一看，我就觉得有点晕，command&nbsp;line我觉得好囧，Ant我不会应该也快被maven淘汰了吧？Grails我google了一下才有所了解。那我知道的就maven和servlet&nbsp;listener。Servlet&nbsp;listener&nbsp;非web项目咋办呢？好吧，只有maven一条出路了。在官网找了半天，才发现这东西还支持spring,刚好手头的项目是架在spring上面的。<br />
<img src="http://www.blogjava.net/images/blogjava_net/zhenxuanpan/图片5.jpg" width="154" height="131" alt="" /><br />
</span></p>
<div>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">所以，就在spring上面捣鼓了一下，把官方的配置copy一份到自己的xml中就行了（</span><a href="http://www.liquibase.org/manual/spring"><span style="mso-spacerun:'yes'; color:#0000ff; text-decoration:underline ;font-size:10.5000pt; font-family:'Times New Roman'; ">http://www.liquibase.org/manual/spring</span></a>&nbsp;<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">）。<br />
<br />
</span></p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">bean&nbsp;id="liquibase"&nbsp;class="liquibase.integration.spring.SpringLiquibase"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="dataSource"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="myDataSource"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="changeLog"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="classpath:db-changelog.xml"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">&lt;!--</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contexts&nbsp;specifies&nbsp;the&nbsp;runtime&nbsp;contexts&nbsp;to&nbsp;use.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">--&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="contexts"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="test,&nbsp;production"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;<br />
</span></div>
<p>&nbsp;<span class="Apple-style-span" style="font-family: 宋体; ">运行了一下，一切OK。</span></p><div><div style="layout-grid:15.6000pt; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">不过还是要吐槽一下，如果不是web项目，不用maven,不用spring.那这东西是不是就不能用了呢？</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">为啥不能支持一下通过代码去load执行呢？</span></p></div></div>
</div>
<p>&nbsp;-------------------------------------------------------------------------------------<br />初步使用了一下，值得挖掘的东西应该还是很多的。<br />记录一下liquibase的源代码地址：<a href="https://github.com/liquibase/liquibase">https://github.com/liquibase/liquibase</a>。</p>
</div>
<p>&nbsp;</p>
</div>
<p>&nbsp;</p>
</div>
<p>&nbsp;</p>
</div>
<p>&nbsp;</p>
</div>
<p>&nbsp;</p>
</div><img src ="http://www.blogjava.net/zhenxuanpan/aggbug/369631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhenxuanpan/" target="_blank">潘潘.eagle</a> 2012-02-09 00:09 <a href="http://www.blogjava.net/zhenxuanpan/archive/2012/02/09/369631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java Annotation初用</title><link>http://www.blogjava.net/zhenxuanpan/archive/2012/01/21/368799.html</link><dc:creator>潘潘.eagle</dc:creator><author>潘潘.eagle</author><pubDate>Fri, 20 Jan 2012 17:19:00 GMT</pubDate><guid>http://www.blogjava.net/zhenxuanpan/archive/2012/01/21/368799.html</guid><wfw:comment>http://www.blogjava.net/zhenxuanpan/comments/368799.html</wfw:comment><comments>http://www.blogjava.net/zhenxuanpan/archive/2012/01/21/368799.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhenxuanpan/comments/commentRss/368799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhenxuanpan/services/trackbacks/368799.html</trackback:ping><description><![CDATA[<div>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">对</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">java的Annotation不是太熟悉，不过最近又要用，所以就找了相关的文档看了下，并写了一个Demo</span></p>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">基本的需求如下：</span></p>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">Server根据对方传递的类型码找到具体的某个类的具体方法并运行。个人觉得用Annotation去注释代码比较好，也减少配置文件，所以就体验了一把。<br />
</span></p>
<div>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">具体代码如下：</span></p>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">1、</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">先定义一个自己的Annotation</span></p>
</div>
<span class="Apple-style-span" style="font-family: 宋体; font-size: 13px; ">@Retention(RetentionPolicy.RUNTIME)</span><span style="font-family: 宋体; ">
<div>
<div style="background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="font-size: 13px; color: #0000ff; ">public</span><span style="font-size: 13px; color: #000000; ">&nbsp;@</span><span style="font-size: 13px; color: #0000ff; ">interface</span><span style="color: #000000; "><font class="Apple-style-span" size="2">&nbsp;CodeAnnotation&nbsp;{</font><br />
<font class="Apple-style-span" size="2">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;code();</font><br />
<font class="Apple-style-span" size="2">}</font></span></div>
</div>
</span>
<p>&nbsp; &nbsp; &nbsp;<span class="Apple-style-span" style="font-family: 宋体; font-size: 16px; ">这里一定要将自己的Annotation定义为运行时的，默认好像是编译时的，所以无法动态的根据server接收到的code去匹配函数<br />
&nbsp; &nbsp;2、</span><span class="Apple-style-span" style="font-size: 13px; ">@Override</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">定义父类basicHandler通过放射去获取执行子类的方法<br />
</span></p>
<div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Message&nbsp;execute(Message&nbsp;message)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;code&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;message.getCode();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;className&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.getClass().getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Message&nbsp;msg&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(Method&nbsp;m&nbsp;:&nbsp;Class.forName(className).getMethods())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(m.getAnnotation(CodeAnnotation.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(code.equals(m.getAnnotation(CodeAnnotation.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">).code()))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(Message)m.invoke(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">,&nbsp;message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(IllegalAccessException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(InvocationTargetException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(SecurityException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(ClassNotFoundException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span></div>
</div>&nbsp; &nbsp; &nbsp; <span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 16px; ">这是基类中的方法，基类实现了接口中的execute方法，子类继承父类，并添加具体的业务方法和代码<br />&nbsp; &nbsp;3、</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">一个具体的handler类示例<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@CodeAnnotation(code&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">10000001</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Message&nbsp;method(Message&nbsp;message)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(message.getUserId());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">TODO:</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>&nbsp; &nbsp;&nbsp;</span><span class="Apple-style-span" style="font-family: 宋体; ">上面的代码，基本上手工的完成了命令码和方法的映射，个人对Spring还不是很精通，不知道Spring有没有完成现成的功能，不想重复早轮子。希望大侠们可以留言告之。</span><img src ="http://www.blogjava.net/zhenxuanpan/aggbug/368799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhenxuanpan/" target="_blank">潘潘.eagle</a> 2012-01-21 01:19 <a href="http://www.blogjava.net/zhenxuanpan/archive/2012/01/21/368799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>full stack framework解释</title><link>http://www.blogjava.net/zhenxuanpan/archive/2011/12/14/366372.html</link><dc:creator>潘潘.eagle</dc:creator><author>潘潘.eagle</author><pubDate>Wed, 14 Dec 2011 12:26:00 GMT</pubDate><guid>http://www.blogjava.net/zhenxuanpan/archive/2011/12/14/366372.html</guid><wfw:comment>http://www.blogjava.net/zhenxuanpan/comments/366372.html</wfw:comment><comments>http://www.blogjava.net/zhenxuanpan/archive/2011/12/14/366372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhenxuanpan/comments/commentRss/366372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhenxuanpan/services/trackbacks/366372.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;今天上iteye上看到一个老帖子，是关于full-stack framework的一个点评，对这个概念并不熟悉，所以就google了一下，综合下各方面的解释。<br />&nbsp; &nbsp;1、from wiki<br /><img src="http://www.blogjava.net/images/blogjava_net/zhenxuanpan/捕获.PNG" width="1069" height="59" alt="" /><br />&nbsp; &nbsp;基本意思是说：full stack framework是将有用的多个web开发库整合为一个单内聚的软件栈框架（栈应该是一个形象的比喻吧）给web 开发者使用。<br />&nbsp; &nbsp;个人的理解应该就是一整套的解决方案，而不是像struts这样只是MVC或者像mybatis这样的ORM框架。<br />&nbsp; &nbsp;2、oschina上面刚好也有人问这个问题，看的一个不错的解答，就copy过来<br />&nbsp; &nbsp;&nbsp;<div style="display: inline-block; "></div><span class="Apple-style-span" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: normal; "><div class="body" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 630px; "><div class="detail" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 10.5pt; "><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; ">&nbsp; &nbsp; &nbsp;full-stack 的设计，意味着各层能够无缝的集成在一起，遵循的DRY原则（don't repeat &nbsp; &nbsp; yourself)，将各层共用的东西，抽取出来，并通过自顶向下的设计，无缝的集成在一起，粘合在一起，达到更高层次、更粗粒度的重用，同时为了保证灵活的可扩展性，在更高、更粗的粒度上遵守开放-封闭的原则，在各层的各个关键点，要提供诸多的钩子，回调的接口，供使用者扩展。full-stack的设计，在层与层之间，并不一味的追求松散的机制，而是相反，在层与层之间增强一定的内聚性，粘合力，以此来达到粗粒度的封装与重用。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; ">可以说full-stack 的设计，其爆发出的威力是巨大的，相对普通的单一层面的设计，在开发效率上不是一个层次上的，基于28原理的设计，可以满足80的调用者直接开发，19%的调用者，通过扩展点进行扩展来满足需求，对于1%钻角尖的需求，自己去造轮子。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; ">spring, ruby on rails, Zend都是这样的工业级强度的full-stack的设计，我们的设计如果以他们为中心，生产力得到了极大的提高。<br />&nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp;</p></div></div></span><span class="Apple-style-span" style="font-family: Verdana, sans-serif, 宋体; line-height: normal; "><br /><div class="clear" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; clear: both; font-size: 1px; line-height: 0; "></div><div class="replies" id="PostReplies_62547" style="font-size: 13px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 50px; "></div></span><span class="Apple-style-span" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: normal; "><div class="body" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 630px; "><div class="detail" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 10.5pt; "><div></div></div></div><div class="clear" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; clear: both; font-size: 1px; line-height: 0; "></div><div class="replies" id="PostReplies_62547" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 50px; "></div></span><img src ="http://www.blogjava.net/zhenxuanpan/aggbug/366372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhenxuanpan/" target="_blank">潘潘.eagle</a> 2011-12-14 20:26 <a href="http://www.blogjava.net/zhenxuanpan/archive/2011/12/14/366372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java模拟测试代码（思路）2011-11-17</title><link>http://www.blogjava.net/zhenxuanpan/archive/2011/11/17/364024.html</link><dc:creator>潘潘.eagle</dc:creator><author>潘潘.eagle</author><pubDate>Wed, 16 Nov 2011 17:15:00 GMT</pubDate><guid>http://www.blogjava.net/zhenxuanpan/archive/2011/11/17/364024.html</guid><wfw:comment>http://www.blogjava.net/zhenxuanpan/comments/364024.html</wfw:comment><comments>http://www.blogjava.net/zhenxuanpan/archive/2011/11/17/364024.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhenxuanpan/comments/commentRss/364024.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhenxuanpan/services/trackbacks/364024.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; 实验室的项目开发完成后需要做测试，apache倒是有一些工具。因为我对测试工具没有什么概念，所以就只能写代码去模拟Web页面的get请求，主要是向看看最大并发是多少。（虽然感觉这种学校的系统，并发量也不会太高）。用的第三方包就是httpclient。<br />&nbsp; &nbsp; 基本思路如下： 1、首先httpGet请求登陆页面，因为httpGet会自动跳转（httpPost是不可以自动跳转）的SSO的登陆页面.<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2、解析SSO的登陆页面，以前做垂直搜索的时候对网页分解有过一些了解。这次没有用第三方的包，因为解析简单所以用一些正则表达式就可以提取 &nbsp; 到form的action，以及一些input的key,特别要注意的就是hidden的一些key,value。（实验室的项目中一个hidden的参数的value是动态改变的）。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3、通过httpPost去请求action，并添加对应的参数列表。如果验证成功，应该返回一个StatusCode为302，通过header的"location"key可以得到属性对应的value。这个value中一般为跳转的页面，里面包含sessionId和ticket。通过httpClient的属性可以得到cookie值（这个cookie可以共享多个client模拟同一个用户登录测试）。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4、通过得到的location的value,用httpGet去请求得到mainPage(注意每次请求后httpGet or httpPost都要执行abort(),否则会抛异常)，解析mainPage,提取链接的网页。将所有page link存在一个list中。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5、遍历page link,解析所有的page,提取每个page的js和css的链接存入另外的一个list中。（因为实验室项目的所有网页的链接均可以再mainPage中提取到，如果不是这样，可以一边解析每个页面，一边加入pageList，这样就是一个不停止的小爬虫了）<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;6、merge两个list为一个统一的list,采用多线程每次随机的取一个link发送get请求，可以打印出返回的statusCode。并且统计每个页面的失败情况<br />&nbsp; &nbsp; 后续要改进的地方：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1、提取每个页面的参数，并通过某种形式展现出来（swing or web），这样来模拟post请求。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2、模拟注册，这个当然有些麻烦。特别是图片验证码。不过自己系统绕过这个点。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3、。。。etc,其实改进的点可以很多，偶只想到这么多。。 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OK,代码在linux下面，跑到windows下面看论文。。好吧。改天上代码。看见某度的一个ITer挂了。。压力有点大。早睡早起吧。有什么好的意见，希望告诉偶。。<img src ="http://www.blogjava.net/zhenxuanpan/aggbug/364024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhenxuanpan/" target="_blank">潘潘.eagle</a> 2011-11-17 01:15 <a href="http://www.blogjava.net/zhenxuanpan/archive/2011/11/17/364024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程一</title><link>http://www.blogjava.net/zhenxuanpan/archive/2011/09/01/357769.html</link><dc:creator>潘潘.eagle</dc:creator><author>潘潘.eagle</author><pubDate>Thu, 01 Sep 2011 15:17:00 GMT</pubDate><guid>http://www.blogjava.net/zhenxuanpan/archive/2011/09/01/357769.html</guid><wfw:comment>http://www.blogjava.net/zhenxuanpan/comments/357769.html</wfw:comment><comments>http://www.blogjava.net/zhenxuanpan/archive/2011/09/01/357769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhenxuanpan/comments/commentRss/357769.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhenxuanpan/services/trackbacks/357769.html</trackback:ping><description><![CDATA[<div> 	<title></title> 	 	   <p style="margin-bottom: 0cm">首先看一下，java中线程状态转换简图，因为以上的线程操作都是调度线程从某一个状态到另外一种状态的切换。<br />&nbsp; &nbsp;<img src="http://www.blogjava.net/images/blogjava_net/zhenxuanpan/t.png" width="527" height="258" alt="" /></p> <p style="margin-bottom: 0cm">	</p> <ol> 	<li><p style="margin-bottom: 0cm">Sleep()方法</p> </li></ol> <p style="margin-left: 0.74cm; margin-bottom: 0cm">在java中Sleep方法主要用于让当前处于运行态的线程变为休眠态。这样系统在调度可运行的线程进入运行态时就不考虑此线程。同时休眠时间结束，该线程也不是直接进入运行态，而是进入可运行的队列，等待系统的调度。</p> <p style="margin-left: 0.74cm; margin-bottom: 0cm">线程从运行态进入休眠态并不释放对象锁，因为线程休眠的时间是可以由程序定的，而进入可运行态却是由操作系统确定的。</p> <ol start="2"> 	<li><p style="margin-bottom: 0cm">wait()方法</p> </li></ol> <p style="margin-left: 0.64cm; margin-bottom: 0cm">在java中wait方法，在Java中Object对象有wait方法，所以每个对象继承拥有了wait方法。</p> <p style="margin-left: 0.64cm; margin-bottom: 0cm">Wait方法的作用是拥有对象a的锁的线程释放该锁给别的线程。因为处于锁定同步方法或同步代码块内的代码失去锁则无法继续执行。调用wait()方法也会让线程从运行态切换到不可运行态(即等待，阻塞，睡眠),所以等待其他线程调用notify()或者notifyall()方法才有可能让该线程从不可运行态变到可运行态。</p> <ol start="3"> 	<li><p style="margin-bottom: 0cm">notify()方法</p> </li></ol> <p style="margin-left: 0.64cm; margin-bottom: 0cm">notify()方法和wait()方法类似，都是Object对象所拥有的方法，每个对象都默认有notify()方法。调用 specialObject.notify()方法就是当前线程释放对象锁，让其他等待该线程锁的某一个线程获得该对象锁，从而从阻塞态变为可运行态。等待系统调度该线程进入运行态。Notifyall()的区别则是将所有等待该对象锁的wait线程全部退出wait状态去竞争对象锁。</p> <p style="margin-left: 0.64cm; margin-bottom: 0cm">注意：</p> <p style="margin-left: 1.38cm; text-indent: 0.11cm; margin-bottom: 0cm"> notify()是选择一个线程并获得对象锁。</p> <p style="margin-left: 0.64cm; margin-bottom: 0cm">		Notifyall()是让所有方法退出wait状态，最后只会有一个对象获得对象锁。<br />pdf下载：<a href="/Files/zhenxuanpan/java多线程一.pdf">/Files/zhenxuanpan/java多线程一.pdf</a></p> <p style="margin-bottom: 0cm"></p></div><img src ="http://www.blogjava.net/zhenxuanpan/aggbug/357769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhenxuanpan/" target="_blank">潘潘.eagle</a> 2011-09-01 23:17 <a href="http://www.blogjava.net/zhenxuanpan/archive/2011/09/01/357769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>乱扯一下《effective java》</title><link>http://www.blogjava.net/zhenxuanpan/archive/2011/04/30/349308.html</link><dc:creator>潘潘.eagle</dc:creator><author>潘潘.eagle</author><pubDate>Sat, 30 Apr 2011 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/zhenxuanpan/archive/2011/04/30/349308.html</guid><wfw:comment>http://www.blogjava.net/zhenxuanpan/comments/349308.html</wfw:comment><comments>http://www.blogjava.net/zhenxuanpan/archive/2011/04/30/349308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhenxuanpan/comments/commentRss/349308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhenxuanpan/services/trackbacks/349308.html</trackback:ping><description><![CDATA[<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
<m:mathPr>
<m:mathFont m:val="Cambria Math" />
<m:brkBin m:val="before" />
<m:brkBinSub m:val="&#45;-" />
<m:smallFrac m:val="off" />
<m:dispDef/>
<m:lMargin m:val="0" />
<m:rMargin m:val="0" />
<m:defJc m:val="centerGroup" />
<m:wrapIndent m:val="1440" />
<m:intLim m:val="subSup" />
<m:naryLim m:val="undOvr" />
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267">
<w:LsdException locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal" />
<w:LsdException locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 2" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 3" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 4" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 5" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 6" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 7" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 8" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 9" />
<w:LsdException locked="false" priority="39" name="toc 1" />
<w:LsdException locked="false" priority="39" name="toc 2" />
<w:LsdException locked="false" priority="39" name="toc 3" />
<w:LsdException locked="false" priority="39" name="toc 4" />
<w:LsdException locked="false" priority="39" name="toc 5" />
<w:LsdException locked="false" priority="39" name="toc 6" />
<w:LsdException locked="false" priority="39" name="toc 7" />
<w:LsdException locked="false" priority="39" name="toc 8" />
<w:LsdException locked="false" priority="39" name="toc 9" />
<w:LsdException locked="false" priority="35" qformat="true" name="caption" />
<w:LsdException locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title" />
<w:LsdException locked="false" priority="1" name="Default Paragraph Font" />
<w:LsdException locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle" />
<w:LsdException locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong" />
<w:LsdException locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis" />
<w:LsdException locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid" />
<w:LsdException locked="false" unhidewhenused="false" name="Placeholder Text" />
<w:LsdException locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1" />
<w:LsdException locked="false" unhidewhenused="false" name="Revision" />
<w:LsdException locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph" />
<w:LsdException locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote" />
<w:LsdException locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6" />
<w:LsdException locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis" />
<w:LsdException locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis" />
<w:LsdException locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference" />
<w:LsdException locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference" />
<w:LsdException locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title" />
<w:LsdException locked="false" priority="37" name="Bibliography" />
<w:LsdException locked="false" priority="39" qformat="true" name="TOC Heading" />
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
</style>
<![endif]--><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="2049" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 以前迷糊的看了大半《</span><span lang="EN-US">effective java</span><span style="font-family: 宋体;">》</span><span lang="EN-US">,</span><span style="font-family: 宋体;">有些看的云里雾里，有些则看的非常开心。这次决定沉下心来好好从头读一遍，就像当初看《</span><span lang="EN-US">think in java</span><span style="font-family: 宋体;">》一样。个人感觉《</span><span lang="EN-US">effective java</span><span style="font-family: 宋体;">》非常不适合新手阅读，因为这本书更多的是讲的是一些</span><span lang="EN-US">skill</span><span style="font-family: 宋体;">，而不是</span><span lang="EN-US">knowledge</span><span style="font-family: 宋体;">。所以在没有在好好掌握好</span><span lang="EN-US">knowledge</span><span style="font-family: 宋体;">之前看是不明智的，也打击自信心的。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 在看的同时，我一直在思考一个问题，书中提到的这些</span><span lang="EN-US">skills</span><span style="font-family: 宋体;">确实非常好，可是我们在实际</span><span lang="EN-US">design</span><span style="font-family: 宋体;">或者</span><span lang="EN-US">coding</span><span style="font-family: 宋体;">中如何用上去呢？就像软件工程的一些东西，好吗？非常好，可是作为一个新手，或者还没到能够把这些</span><span lang="EN-US">skills</span><span style="font-family: 宋体;">用到实际项目中的人，如何去用？</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 这是一个蛮苦恼的问题，想了半天，也许我的解答就是犯错。给你失败的机会，当你用一些不好的东西带来痛苦的时候，你就开始寻找新的路。然后这些</span><span lang="EN-US">skill</span><span style="font-family: 宋体;">就会帮你很</span><span lang="EN-US">happy</span><span style="font-family: 宋体;">的解决这些问题。就像最近看</span><span lang="EN-US">Nosql</span><span style="font-family: 宋体;">，每一种技术的兴起，绝对有它特定的需求。也许</span><span lang="EN-US">IT</span><span style="font-family: 宋体;">这个领域永远都要跟着需求走才是对的。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 那是不是，现在不需要去看《</span><span lang="EN-US">effective java</span><span style="font-family: 宋体;">》这种书呢？我还是觉得</span><span lang="EN-US">no,</span><span style="font-family: 宋体;">因为知识是一个积累的过程，就像</span><span lang="EN-US">Design pattern</span><span style="font-family: 宋体;">，当初学习的时候，感觉非常好的东西，学完就忘记了，可是真的到项目中，老大说去按照某个模式去实现的时候，你会豁然开朗，确实这样会好很多，慢慢的就在积累属于自己的经验。先积累知识，后积累经验。</span><span lang="EN-US">No forever,</span><span style="font-family: 宋体;">这个领域永远都有很多新的东西。。呵呵。。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 好了，乱扯了这么多，大囧。。还是继续看书，继续记录自己学习中的点点滴滴吧。哈哈。。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; ---------------学习笔记的链接（持续添加ing）-</span><span style="font-family: 宋体;">--------------</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 1、<a href="http://www.blogjava.net/zhenxuanpan/articles/349309.html">《Effective java》学习笔记1</a><br />
</span></p>

<img src ="http://www.blogjava.net/zhenxuanpan/aggbug/349308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhenxuanpan/" target="_blank">潘潘.eagle</a> 2011-04-30 09:56 <a href="http://www.blogjava.net/zhenxuanpan/archive/2011/04/30/349308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>