﻿<?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-MikeChen专注电子商务</title><link>http://www.blogjava.net/mikechen/</link><description>电子商务技术架构</description><language>zh-cn</language><lastBuildDate>Tue, 21 Apr 2026 08:43:26 GMT</lastBuildDate><pubDate>Tue, 21 Apr 2026 08:43:26 GMT</pubDate><ttl>60</ttl><item><title>java classLoader 体系结构</title><link>http://www.blogjava.net/mikechen/archive/2013/06/20/400762.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Thu, 20 Jun 2013 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2013/06/20/400762.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/400762.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2013/06/20/400762.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/400762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/400762.html</trackback:ping><description><![CDATA[<div style="margin-bottom: 10px; overflow: auto; zoom: 1; padding-left: 1px; padding-right: 1px; padding-bottom: 1px; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #cccccc; font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; font-size: 13px; line-height: normal;"><span style="float: left;"><br /></span></div><div post="" hentry="" category-java="" tag-architecture=""  tag-classloader"="" id="post-1060" style="margin-bottom: 20px; overflow: auto; zoom: 1; padding-bottom: 10px; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #cccccc; font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; font-size: 13px; line-height: normal;"><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"><a href="http://creativecommons.org/licenses/by/3.0/deed.zh" rel="bookmark" style="text-decoration: none; color: #0044aa;">版权信息</a>: 可以任意转载, 转载时请务必以超链接形式标明文章<strong>原文出处</strong>, 即下面的声明.</p><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"></p><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;">原文出处：<a href="http://blog.chenlb.com/2009/06/java-classloader-architecture.html" style="text-decoration: none; color: #0044aa;">http://blog.chenlb.com/2009/06/java-classloader-architecture.html</a></p><div style="width: 692px;"><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"><strong>jvm classLoader architecture：</strong></p><ol style="margin: 0px 0px 15px; padding: 0px; list-style-position: initial; list-style-image: initial;"><li style="margin: 0px; padding: 0px; line-height: 20px;">Bootstrap ClassLoader/启动类加载器&nbsp;<br />主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作。</li><li style="margin: 0px; padding: 0px; line-height: 20px;">Extension ClassLoader/扩展类加载器&nbsp;<br />主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作。</li><li style="margin: 0px; padding: 0px; line-height: 20px;">System ClassLoader/系统类加载器&nbsp;<br />主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作。</li><li style="margin: 0px; padding: 0px; line-height: 20px;">User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)&nbsp;<br />在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性。</li></ol><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"><strong>类加载器的特性：</strong></p><ol style="margin: 0px 0px 15px; padding: 0px; list-style-position: initial; list-style-image: initial;"><li style="margin: 0px; padding: 0px; line-height: 20px;">每个ClassLoader都维护了一份自己的名称空间， 同一个名称空间里不能出现两个同名的类。</li><li style="margin: 0px; padding: 0px; line-height: 20px;">为了实现java安全沙箱模型顶层的类加载器安全机制, java默认采用了 " 双亲委派的加载链 " 结构。</li></ol><div id="attachment_1066"  alignnone"="" style="border: 1px solid #dddddd; text-align: center; background-color: #f3f3f3; padding-top: 4px; margin: 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; width: 177px;"><img wp-image-1066=""  "="" title="classloader-architecture" src="http://blog.chenlb.com/wp-content/uploads/2009/06/classloader-architecture.jpg" alt="classloader-architecture" width="167" height="281" style="border: 0px none; max-width: 600px; margin: 0px; padding: 0px;" /><p style="margin: 0px; padding: 0px 4px 5px; line-height: 17px; font-size: 11px;">classloader-architecture</p></div><div id="attachment_1067"  alignnone"="" style="border: 1px solid #dddddd; text-align: center; background-color: #f3f3f3; padding-top: 4px; margin: 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; width: 353px;"><img wp-image-1067=""  "="" title="classloader-class-diagram" src="http://blog.chenlb.com/wp-content/uploads/2009/06/classloader-class-diagram.jpg" alt="classloader-class-diagram" width="343" height="465" style="border: 0px none; max-width: 600px; margin: 0px; padding: 0px;" /><p style="margin: 0px; padding: 0px 4px 5px; line-height: 17px; font-size: 11px;">classloader-class-diagram</p></div><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;">类图中， BootstrapClassLoader是一个单独的java类， 其实在这里， 不应该叫他是一个java类。因为，它已经完全不用java实现了。它是在jvm启动时， 就被构造起来的， 负责java平台核心库。</p><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"><strong>自定义类加载器加载一个类的步骤</strong></p><div id="attachment_1068"  alignnone"="" style="border: 1px solid #dddddd; text-align: center; background-color: #f3f3f3; padding-top: 4px; margin: 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; width: 593px;"><img wp-image-1068=""  "="" title="classloader-load-class" src="http://blog.chenlb.com/wp-content/uploads/2009/06/classloader-load-class.jpg" alt="classloader-load-class" width="583" height="289" style="border: 0px none; max-width: 600px; margin: 0px; padding: 0px;" /><p style="margin: 0px; padding: 0px 4px 5px; line-height: 17px; font-size: 11px;">classloader-load-class</p></div><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"><strong>ClassLoader 类加载逻辑分析， 以下逻辑是除 BootstrapClassLoader 外的类加载器加载流程：</strong></p><div style="font-family: 'Courier New', Courier, mono; width: 671.234375px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word;"><div></div><ol start="1" style="margin-bottom: 15px; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">//&nbsp;检查类是否已被装载过&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">Class&nbsp;c&nbsp;=&nbsp;findLoadedClass(name);&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;"><span style="color: #7f0055;">if</span>&nbsp;(c&nbsp;==&nbsp;<span style="color: #7f0055;">null</span>&nbsp;)&nbsp;{&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;指定类未被装载过&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">try</span>&nbsp;{&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">if</span>&nbsp;(parent&nbsp;!=&nbsp;<span style="color: #7f0055;">null</span>&nbsp;)&nbsp;{&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果父类加载器不为空，&nbsp;则委派给父类加载&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;parent.loadClass(name,&nbsp;<span style="color: #7f0055;">false</span>&nbsp;);&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #7f0055;">else</span>&nbsp;{&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果父类加载器为空，&nbsp;则委派给启动类加载加载&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;findBootstrapClass0(name);&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #7f0055;">catch</span>&nbsp;(ClassNotFoundException&nbsp;e)&nbsp;{&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;启动类加载器或父类加载器抛出异常后，&nbsp;当前类加载器将其&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;捕获，&nbsp;并通过findClass方法，&nbsp;由自身加载&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;findClass(name);&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">}&nbsp;&nbsp;</li></ol></div><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"><strong>线程上下文类加载器</strong><br />java默认的线程上下文类加载器是 系统类加载器(AppClassLoader)。</p><div style="font-family: 'Courier New', Courier, mono; width: 671.234375px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word;"><div></div><ol start="1" style="margin-bottom: 15px; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">//&nbsp;Now&nbsp;create&nbsp;the&nbsp;class&nbsp;loader&nbsp;to&nbsp;use&nbsp;to&nbsp;launch&nbsp;the&nbsp;application&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;"><span style="color: #7f0055;">try</span>&nbsp;{&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;loader&nbsp;=&nbsp;AppClassLoader.getAppClassLoader(extcl);&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">}&nbsp;<span style="color: #7f0055;">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">throw</span>&nbsp;<span style="color: #7f0055;">new</span>&nbsp;InternalError(&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">"Could&nbsp;not&nbsp;create&nbsp;application&nbsp;class&nbsp;loader"&nbsp;);&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">}&nbsp;&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">//&nbsp;Also&nbsp;set&nbsp;the&nbsp;context&nbsp;class&nbsp;loader&nbsp;for&nbsp;the&nbsp;primordial&nbsp;thread.&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">Thread.currentThread().setContextClassLoader(loader);&nbsp;&nbsp;</li></ol></div><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;">以上代码摘自sun.misc.Launch的无参构造函数Launch()。</p><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;">使用线程上下文类加载器, 可以在执行线程中, 抛弃双亲委派加载链模式, 使用线程上下文里的类加载器加载类.<br />典型的例子有, 通过线程上下文来加载第三方库jndi实现, 而不依赖于双亲委派.<br />大部分java app服务器(jboss, tomcat..)也是采用contextClassLoader来处理web服务。<br />还有一些采用 hotswap 特性的框架, 也使用了线程上下文类加载器, 比如 seasar (full stack framework in japenese).</p><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;">线程上下文从根本解决了一般应用不能违背双亲委派模式的问题.<br />使java类加载体系显得更灵活.</p><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;">随着多核时代的来临, 相信多线程开发将会越来越多地进入程序员的实际编码过程中. 因此,<br />在编写基础设施时， 通过使用线程上下文来加载类, 应该是一个很好的选择。</p><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;">当然, 好东西都有利弊. 使用线程上下文加载类, 也要注意, 保证多根需要通信的线程间的类加载器应该是同一个,<br />防止因为不同的类加载器, 导致类型转换异常(ClassCastException)。</p><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"><strong>为什么要使用这种双亲委托模式呢？</strong></p><ol style="margin: 0px 0px 15px; padding: 0px; list-style-position: initial; list-style-image: initial;"><li style="margin: 0px; padding: 0px; line-height: 20px;">因为这样可以避免重复加载，当父亲已经加载了该类的时候，就没有必要子ClassLoader再加载一次。</li><li style="margin: 0px; padding: 0px; line-height: 20px;">考虑到安全因素，我们试想一下，如果不使用这种委托模式，那我们就可以随时使用自定义的String来动态替代java核心api中定义类型，这样会存在非常大的安全隐患，而双亲委托的方式，就可以避免这种情况，因为String已经在启动时被加载，所以用户自定义类是无法加载一个自定义的ClassLoader。</li></ol><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"><strong>java动态载入class的两种方式：</strong></p><ol style="margin: 0px 0px 15px; padding: 0px; list-style-position: initial; list-style-image: initial;"><li style="margin: 0px; padding: 0px; line-height: 20px;">implicit隐式,即利用实例化才载入的特性来动态载入class</li><li style="margin: 0px; padding: 0px; line-height: 20px;">explicit显式方式,又分两种方式:<ol style="margin: 0px 0px 15px; padding: 0px; list-style-position: initial; list-style-image: initial;"><li style="margin: 0px; padding: 0px;">java.lang.Class的forName()方法</li><li style="margin: 0px; padding: 0px;">java.lang.ClassLoader的loadClass()方法</li></ol></li></ol><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"><strong>用Class.forName加载类</strong></p><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;">Class.forName使用的是被调用者的类加载器来加载类的。<br />这种特性, 证明了java类加载器中的名称空间是唯一的, 不会相互干扰。<br />即在一般情况下, 保证同一个类中所关联的其他类都是由当前类的类加载器所加载的。</p><div style="font-family: 'Courier New', Courier, mono; width: 671.234375px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word;"><div></div><ol start="1" style="margin-bottom: 15px; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">static</span>&nbsp;Class&nbsp;forName(String&nbsp;className)&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">throws</span>&nbsp;ClassNotFoundException&nbsp;{&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;forName0(className,&nbsp;<span style="color: #7f0055;">true</span>&nbsp;,&nbsp;ClassLoader.getCallerClassLoader());&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">}&nbsp;&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">/**&nbsp;Called&nbsp;after&nbsp;security&nbsp;checks&nbsp;have&nbsp;been&nbsp;made.&nbsp;*/&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;"><span style="color: #7f0055;">private</span>&nbsp;<span style="color: #7f0055;">static</span>&nbsp;<span style="color: #7f0055;">native</span>&nbsp;Class&nbsp;forName0(String&nbsp;name,&nbsp;<span style="color: #7f0055;">boolean</span>&nbsp;initialize,&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">ClassLoader&nbsp;loader)&nbsp;&nbsp;</li><li style="margin-left: 38px; padding-right: 0px; line-height: 18px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">throws</span>&nbsp;ClassNotFoundException;&nbsp;&nbsp;</li></ol></div><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;">上面中 ClassLoader.getCallerClassLoader 就是得到调用当前forName方法的类的类加载器</p><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"><strong>static块在什么时候执行?</strong></p><ul style="margin: 0px 0px 15px 20px; padding: 0px; list-style-position: inside; list-style-image: initial;"><li style="margin: 0px; padding: 0px; line-height: 20px;">当调用forName(String)载入class时执行,如果调用ClassLoader.loadClass并不会执行.forName(String,false,ClassLoader)时也不会执行.</li><li style="margin: 0px; padding: 0px; line-height: 20px;">如果载入Class时没有执行static块则在第一次实例化时执行.比如new ,Class.newInstance()操作</li><li style="margin: 0px; padding: 0px; line-height: 20px;">static块仅执行一次</li></ul><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"><strong>各个java类由哪些classLoader加载?</strong></p><ul style="margin: 0px 0px 15px 20px; padding: 0px; list-style-position: inside; list-style-image: initial;"><li style="margin: 0px; padding: 0px; line-height: 20px;">java类可以通过实例.getClass.getClassLoader()得知</li><li style="margin: 0px; padding: 0px; line-height: 20px;">接口由AppClassLoader(System ClassLoader,可以由ClassLoader.getSystemClassLoader()获得实例)载入</li><li style="margin: 0px; padding: 0px; line-height: 20px;">ClassLoader类由bootstrap loader载入</li></ul><p style="margin: 0px 0px 15px; padding: 0px; line-height: 20px;"><strong>NoClassDefFoundError和ClassNotFoundException</strong></p><ul style="margin: 0px 0px 15px 20px; padding: 0px; list-style-position: inside; list-style-image: initial;"><li style="margin: 0px; padding: 0px; line-height: 20px;">NoClassDefFoundError:当java源文件已编译成.class文件,但是ClassLoader在运行期间在其搜寻路径load某个类时,没有找到.class文件则报这个错</li><li style="margin: 0px; padding: 0px; line-height: 20px;">ClassNotFoundException:试图通过一个String变量来创建一个Class类时不成功则抛出这个异常</li></ul></div></div><img src ="http://www.blogjava.net/mikechen/aggbug/400762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2013-06-20 10:25 <a href="http://www.blogjava.net/mikechen/archive/2013/06/20/400762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>结构模式-Composite模式</title><link>http://www.blogjava.net/mikechen/archive/2012/08/06/384936.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Mon, 06 Aug 2012 09:49:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2012/08/06/384936.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/384936.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2012/08/06/384936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/384936.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/384936.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>一：使用场景</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp; 1）使用的地方：树形结构，分支结构等</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp; 2）使用的好处：降低客户端的使用，为了达到元件与组合件使用的一致性，增加了元件的编码</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp; 3）使用后的坏处：代码不容易理解，需要你认真去研究，发现元件与组合件是怎么组合的<br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>二：一个实际的例子</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 画图形，这个模式，稍微要难理解一点，有了例子就说明了一切，我画的图是用接口做的，代码实现是抽象类为基类，你自己选择了，接口也可以。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;<img small="0" src="http://hiphotos.baidu.com/feiruinet/pic/item/fbf62338bd76f5ccb311c77a.jpg" style="border: 0px; margin-bottom: 8px; clear: both; max-width: 758px; vertical-align: top; "  alt="" /><br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><br /><strong>1）先建立图形元件</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp; package com.mike.pattern.structure.composite;<br />/**<br />* 图形元件<br />*&nbsp;<br />* @author taoyu<br />*&nbsp;<br />* @since 2010-6-23<br />*/<br />public abstract class Graph {<br />/**图形名称*/<br />protected String name;<br /><br />public Graph(String name){<br />&nbsp;&nbsp; this.name=name;<br />}<br /><br />/**画图*/<br />public abstract void draw()throws GraphException;<br /><br />/**添加图形*/<br />public abstract void add(Graph graph)throws GraphException;<br /><br />/**移掉图形*/<br />public abstract void remove(Graph graph)throws GraphException;<br /><br />}<br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>2)建立基础图形圆</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">package com.mike.pattern.structure.composite;<br />import static com.mike.util.Print.print;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**<br />* 圆图形<br />*&nbsp;<br />* @author taoyu<br />*&nbsp;<br />* @since 2010-6-23<br />*/<br />public class Circle extends Graph {</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public Circle(String name){<br />&nbsp;&nbsp; super(name);<br />}<br /><br />/**<br />* 圆添加图形<br />* @throws GraphException&nbsp;<br />*/<br />@Override<br />public void add(Graph graph) throws GraphException {<br />&nbsp;&nbsp; throw new GraphException("圆是基础图形，不能添加");<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**<br />* 圆画图<br />*/<br />@Override<br />public void draw()throws GraphException {<br />&nbsp;&nbsp; print(name+"画好了");<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**<br />* 圆移掉图形<br />*/<br />@Override<br />public void remove(Graph graph)throws GraphException {<br />&nbsp;&nbsp; throw new GraphException("圆是基础图形，不能移掉");<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>3）建立基础图形长方形</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">package com.mike.pattern.structure.composite;<br />import static com.mike.util.Print.print;<br />/**<br />* 长方形<br />*&nbsp;<br />* @author taoyu<br />*&nbsp;<br />* @since 2010-6-23<br />*/<br />public class Rectangle extends Graph {</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public Rectangle(String name){<br />&nbsp;&nbsp; super(name);<br />}<br /><br />/**<br />* 长方形添加<br />*/<br />@Override<br />public void add(Graph graph) throws GraphException {<br />&nbsp;&nbsp; throw new GraphException("长方形是基础图形，不能添加");<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**<br />* 画长方形<br />*/<br />@Override<br />public void draw() throws GraphException {<br />&nbsp;&nbsp; print(name+"画好了");<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">@Override<br />public void remove(Graph graph) throws GraphException {<br />&nbsp;&nbsp; throw new GraphException("长方形是基础图形，不能移掉");<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">}<br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>4）最后简历组合图形</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">package com.mike.pattern.structure.composite;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">import java.util.ArrayList;<br />import java.util.List;<br />import static com.mike.util.Print.print;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**<br />* 图形组合体<br />*&nbsp;<br />* @author taoyu<br />*&nbsp;<br />* @since 2010-6-23<br />*/<br />public class Picture extends Graph {<br />private List&lt;Graph&gt; graphs;<br /><br />public Picture(String name){<br />&nbsp;&nbsp; super(name);<br />&nbsp;&nbsp; /**默认是10个长度*/<br />&nbsp;&nbsp; graphs=new ArrayList&lt;Graph&gt;();<br />}<br /><br /><br />/**<br />* 添加图形元件<br />*/<br />@Override<br />public void add(Graph graph) throws GraphException {<br />&nbsp;&nbsp; graphs.add(graph);<br />}<br /><br />/**<br />* 图形元件画图<br />*/<br />@Override<br />public void draw() throws GraphException {<br />&nbsp;&nbsp; print("图形容器："+name+" 开始创建");<br />&nbsp;&nbsp; for(Graph g : graphs){<br />&nbsp;&nbsp;&nbsp; g.draw();<br />&nbsp;&nbsp; }<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**<br />* 图形元件移掉图形元件<br />*/<br />@Override<br />public void remove(Graph graph) throws GraphException {<br />&nbsp;&nbsp; graphs.remove(graph);<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>5）最后测试</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public static void main(String[] args)throws GraphException {<br />&nbsp;&nbsp; /**画一个圆，圆里包含一个圆和长方形*/<br />&nbsp;&nbsp; Picture picture=new Picture("立方体圆");<br />&nbsp;&nbsp; picture.add(new Circle("圆"));<br />&nbsp;&nbsp; picture.add(new Rectangle("长方形"));<br />&nbsp;&nbsp;<br />&nbsp;&nbsp; Picture root=new Picture("怪物图形");&nbsp;<br />&nbsp;&nbsp; root.add(new Circle("圆"));<br />&nbsp;&nbsp; root.add(picture);<br />&nbsp;&nbsp; root.draw();<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">6)使用心得：的确降低了客户端的使用情况，让整个图形可控了，当是你要深入去理解，才真名明白采用该模式的含义，不太容易理解。</p><img src ="http://www.blogjava.net/mikechen/aggbug/384936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2012-08-06 17:49 <a href="http://www.blogjava.net/mikechen/archive/2012/08/06/384936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>结构模式-Adapter适配器模式</title><link>http://www.blogjava.net/mikechen/archive/2012/08/06/384935.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Mon, 06 Aug 2012 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2012/08/06/384935.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/384935.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2012/08/06/384935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/384935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/384935.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>一：使用场景</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp; 1）使用的地方：我想使用两个不同类的方法，这个时候你需要把它们组合起来使用</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp; 2）目前使用的情况：我会把两个类用户组合的方式放到一起，编程思想think in java里已经提到个，能尽量用组合就用组合，继承一般考虑再后。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp; 3）使用后的好处：你不需要改动以前的代码，只是新封装了一新类，由这个类来提供两个类的方法，这个时候：一定会想到facade外观模式，本来是多个类使用的情况，我新封装成一个类来使用，而这个类我采用组合的方式来包装新的方法。我的理解是，设计模式本身就是为了帮助解决特定的业务场景而故意把模式划分对应的模式类别，其实大多数情况，都解决了同样的问题，这个时候其实没有必要过多的纠缠到模式的名字上了，你有好的注意，你甚至取一个新的名字来概括这样的使用场景。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 4）使用的坏处：适配器模式，有两种方式来实现。一个是组合一个是继承，我觉得，首先应该考虑组合，能用组合就不要用继承，这是第一个。第二个，你采用继承来实现，那肯定会加大继承树结构，如果你的继承关系本身就很复杂了，这肯定会加大继承关系的维护，不有利于代码的理解，或则更加繁琐。继承是为了解决重用的为题而出现的，所以我觉得不应该滥用继承，有机会可以考虑同样别的方案。<br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>二：一个实际的例子</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关联营销的例子，用户购买完商品后，我又推荐他相关别的商品</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于减少代码，方法我都不采用接口，直接由类来提供，代码只是一个范例而已，都精简了。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>1)创建订单信息</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class Order {<br />private Long orderId;<br />private String nickName;<br /><br />public Order(Long orderId,String nickName){<br />&nbsp;&nbsp; this.orderId=orderId;<br />&nbsp;&nbsp; this.nickName=nickName;<br />}<br /><br />/**<br />* 用户下订单<br />*/<br />public void insertOrder(){<br />&nbsp;&nbsp;<br />}<br />}<br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>2）商品信息</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class Auction {<br />/**商品名称*/<br />private String name;<br /><br />/**制造商*/<br />private String company;<br /><br />/**制造日期*/<br />private Date date;<br /><br /><br />public Auction(String name,String company, Date date){<br />&nbsp;&nbsp; this.name=name;<br />&nbsp;&nbsp; this.company=company;<br />&nbsp;&nbsp; this.date=date;<br />}<br /><br />/**<br />* 推广的商品列表<br />*/<br />public void commendAuction(){<br />&nbsp;&nbsp;<br />}<br /><br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>3）购物</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class Trade {<br />/**用户订单*/<br />private Order order;<br /><br />/**商品信息*/<br />private Auction auction;<br /><br />public Trade(Order order ,Auction auction){<br />&nbsp;&nbsp; this.order=order;<br />&nbsp;&nbsp; this.auction=auction;<br />}<br /><br />/**<br />* 用户产生订单以及后续的事情<br />*/<br />public void trade(){<br />&nbsp;&nbsp; /**下订单*/<br />&nbsp;&nbsp; order.insertOrder();<br />&nbsp;&nbsp;<br />&nbsp;&nbsp; /**关联推荐相关的商品*/<br />&nbsp;&nbsp; auction.commendAuction();<br />}<br /><br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>&nbsp;&nbsp; 4）使用心得：</strong>其实外面采用了很多继承的方式，order继承auction之后，利用super .inserOrder()再加一个auction.recommendAuction(),实际上大同小异，我到觉得采用组合更容易理解以及代码更加优美点。</p><img src ="http://www.blogjava.net/mikechen/aggbug/384935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2012-08-06 17:38 <a href="http://www.blogjava.net/mikechen/archive/2012/08/06/384935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建模式-Builder模式</title><link>http://www.blogjava.net/mikechen/archive/2012/08/06/384934.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Mon, 06 Aug 2012 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2012/08/06/384934.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/384934.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2012/08/06/384934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/384934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/384934.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>一：使用场景</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp; 1)使用到的地方：如果你想创建类似汽车这样的对象，首先要创建轮子，玻璃，桌椅，发动机，外廓等，这些部件都创建好后，最后创建汽车成品，部件的创建和汽车的组装过程本身都很复杂的情况，希望把部件的创建和成品的组装分开来做，这样把要做的事情分割开来，降低对象实现的复杂度，也降低以后成本的维护，把汽车的部件创建和组装过程独立出两个对应的工厂来做，有点类似建立两个对应的部件创建工厂和汽车组装工厂两个工厂，而工厂只是创建一个成品，并没有把里面的步骤也独立出来，应该说Builder模式比工厂模式又进了一步。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 2）采用Builder模式后的好处：把一个负责的对象的创建过程分解，把一个对象的创建分成两个对象来负责创建，代码更有利于维护，可扩性比较好。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp; 3）采用Builder模式后的坏处：实现起来，对应的接口以及部件的对象的创建比较多，代码相对来讲，比较多了，估计刚开始你会有点晕，这个可以考虑代码精简的问题，增加代码的可读性。 &nbsp;<br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>二：一个实际的例子</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>汽车的组装</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;<strong>1)首先创建汽车这个成品对象，包含什么的成员</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class Car implements Serializable{<br /><br />/**<br />* 汽车序列号<br />*/<br />private static final long serialVersionUID = 1L;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**汽车轮子*/<br />private Wheel wheel;<br /><br />/**汽车发动机*/<br />private Engine engine;<br /><br />/**汽车玻璃*/<br />private Glass glass;<br /><br />/**汽车座椅*/<br />private Chair chair;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><br />public Wheel getWheel() {<br />&nbsp;&nbsp; return wheel;<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public void setWheel(Wheel wheel) {<br />&nbsp;&nbsp; this.wheel = wheel;<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public Engine getEngine() {<br />&nbsp;&nbsp; return engine;<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public void setEngine(Engine engine) {<br />&nbsp;&nbsp; this.engine = engine;<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public Glass getGlass() {<br />&nbsp;&nbsp; return glass;<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public void setGlass(Glass glass) {<br />&nbsp;&nbsp; this.glass = glass;<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public Chair getChair() {<br />&nbsp;&nbsp; return chair;<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public void setChair(Chair chair) {<br />&nbsp;&nbsp; this.chair = chair;<br />}<br /><br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>2）创建对应汽车零部件</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class Wheel {<br />public Wheel(){<br />&nbsp;&nbsp; print("--汽车轮子构建完毕--");<br />}<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class Engine {<br />public Engine(){<br />&nbsp;&nbsp; print("--汽车发动机构建完毕--");<br />}<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class Glass {<br />public Glass(){<br />&nbsp;&nbsp; print("--汽车玻璃构建完毕--");<br />}<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class Chair {<br />public Chair(){<br />&nbsp;&nbsp; print("--汽车座椅构建完毕--");<br />}<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>3）开始重点了，汽车成品的组装过程</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp; public interface Builder {<br />/**组装汽车轮子*/<br />public void buildWheel();<br /><br />/**组装汽车发动机*/<br />public void buildEngine();<br /><br />/**组装汽车玻璃*/<br />public void buildGlass();<br /><br />/**组装汽车座椅*/<br />public void buildChair();<br /><br />/**返回组装好的汽车*/<br />public Car getCar();<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">以及实现类</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class CarBuilder implements Builder {<br />/**汽车成品*/<br />private Car car;<br /><br />public CarBuilder(){<br />&nbsp;&nbsp; car=new Car();<br />}<br /><br />/**组装汽车轮子*/<br />@Override<br />public void buildChair() {<br />&nbsp;&nbsp; car.setChair(new Chair());<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**组装汽车发动机*/<br />@Override<br />public void buildEngine() {<br />&nbsp;&nbsp; car.setEngine(new Engine());<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**组装汽车玻璃*/<br />@Override<br />public void buildGlass() {<br />&nbsp;&nbsp; car.setGlass(new Glass());<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**组装汽车座椅*/<br />@Override<br />public void buildWheel() {<br />&nbsp;&nbsp; car.setWheel(new Wheel());<br />}<br /><br />/**返回组装好的汽车*/<br />@Override<br />public Car getCar() {<br />&nbsp;&nbsp; buildChair();<br />&nbsp;&nbsp; buildEngine();<br />&nbsp;&nbsp; buildGlass();<br />&nbsp;&nbsp; buildWheel();<br />&nbsp;&nbsp; print("--整个汽车构建完毕--");<br />&nbsp;&nbsp; return car;<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>4）最后汽车创建测试</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp; public static void main(String[] args) {<br />&nbsp;&nbsp; /**创建汽车组装*/<br />&nbsp;&nbsp; Builder carBuilder=new CarBuilder();<br />&nbsp;&nbsp; Car car=carBuilder.getCar();<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp; 最后输出：</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">--汽车座椅构建完毕--<br />--汽车发动机构建完毕--<br />--汽车玻璃构建完毕--<br />--汽车轮子构建完毕--<br />--整个汽车构建完毕--</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp; 5）<strong>体会心得：</strong>Builder模式实际的重点就把汽车的组装过程和零部件的生产分开来实现，零部件的生成主要靠自己的对象来实现，我上面只是在构造函数里创建了，比较简单，而重点汽车的组装则交给CarBuilder来实现，最终由builder来先负责零部件的创建，最后返回出成品的汽车。</p><img src ="http://www.blogjava.net/mikechen/aggbug/384934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2012-08-06 17:37 <a href="http://www.blogjava.net/mikechen/archive/2012/08/06/384934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建模式-singleon单例模式</title><link>http://www.blogjava.net/mikechen/archive/2012/08/06/384932.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Mon, 06 Aug 2012 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2012/08/06/384932.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/384932.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2012/08/06/384932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/384932.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/384932.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>一：使用场景<br /></strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 1）经常使用的地方：一个类只有一个实例，eg:页面访问统计pv，统计的个数就只能保证一个实例的统计。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 2）我们目前使用的情况：比如我想创建一个对象，这个对象希望只有一份实例的维护，在内存的保存也只有一份，也就是在同一个jvm的java堆里只保存一份实例对象，所以你会想一办法，在创建这个对象的时候，就已经能保证只有一份。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 3）怎么改进：定义该对象的时候，就保证是同一份实例，比如：定义为私有构造函数，防止通过new的方式可以创建对象，然后在对象里定义一个静态的私有成员（本身对象的一个实例），然后再创建一个外面访问该对象的方法就好了。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 4）改进的好处：代码在编译代码这个级别就被控制了，不至于在jvm里运行的时候才来保证，把唯一实例的创建保证在编译阶段；jvm里内存只有一份，从而内存占有率更低，以及更方便java垃圾回收</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 5）改进后的坏处：只能是代码稍微需要更多点，其实大家最后发现改进后的坏处，都是代码定义比之间要多一点，但以后的维护代码就降下来了，也短暂的代码量偏大来换取以后代码的精简。<br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>二：一个实际的例子</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">总体的例子</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">package com.mike.pattern.singleton;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**<br />* 总统<br />*&nbsp;<br />* @author taoyu<br />*&nbsp;<br />* @since 2010-6-22<br />*/<br />public class President {<br />private President(){<br />&nbsp;&nbsp; System.out.println("总统已经选举出来了");<br />}<br /><br />/**总统只有一个*/<br />private static President president=new President();<br /><br />/**<br />* 返回总统<br />*/<br />public static President getPresident(){<br />&nbsp;&nbsp; return president;<br />}<br /><br />/**<br />* 总统宣布选举成功<br />*/<br />public void announce(){<br />&nbsp;&nbsp; System.out.println("伟大的中国人民，我将成你们新的总统");<br />}<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**<br />* @param args<br />*/<br />public static void main(String[] args) {<br />&nbsp;&nbsp; President president=President.getPresident();<br />&nbsp;&nbsp; president.announce();<br />}</p><img src ="http://www.blogjava.net/mikechen/aggbug/384932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2012-08-06 17:33 <a href="http://www.blogjava.net/mikechen/archive/2012/08/06/384932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建模式-工厂模式</title><link>http://www.blogjava.net/mikechen/archive/2012/08/06/384931.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Mon, 06 Aug 2012 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2012/08/06/384931.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/384931.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2012/08/06/384931.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/384931.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/384931.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">1.<strong>使用场景<br /></strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp; 1）子类过多，不容易管理；构造对象过程过长；精简代码创建；<br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 2)目前我们代码情况： 编写代码的时候，我们经常都在new对象，创建一个个的对象，而且还有很多麻烦的创建方式，eg:HashMap&lt;String,Float&gt; grade=new HashMap&lt;String,Float&gt;(),这样的代码创建方式太冗长了，难道你没有想过把这个创建变的短一点么，比如：HashMap&lt;String,Float&gt;grade=HashMapFactory.new(),可以把你创建精简一点；你也可以还有别的需求，在创建对象的时候，你需要不同的情况，创建统一种类别的对象，eg:我想生成不同的汽车，创建小轿车，创建卡车，创建公交汽车等等，都属于同种类别：汽车，你难道没有想过，我把这些创建的对象在一个工厂里来负责创建，我把创建分开化，交给一人来负责，这样可以让代码更加容易管理，创建方式也可以简单点。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">比如：Car&nbsp;&nbsp;&nbsp; BMW=CarFactory.create(bmw);&nbsp;&nbsp; 把创建new由一个统一负责，这样管理起来相当方便</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 3）怎么改进：这个时候，你会想到，创建这样同类别的东西，我把这个权利分出去，让一个人来单独管理，它只负责创建我的对象这个事情，所以你单独简历一个对象来创建同类的对象，这个时候，你想这个东西有点像工厂一样，生成同样的产品，所以取了个名字：工厂模式，顾名思义，只负责对象的创建</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 4）改进后的好处：代码更加容易管理了，代码的创建要简洁很多。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 5）改进后的坏处：那就是你需要单独加一个工厂对象来负责创建，多需要写点代码。<br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>2.一个实际的例子<br /><br /></strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>&nbsp;&nbsp; 创建宝马汽车与奔驰汽车的例子</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp; 1）先提取出一个汽车的公用接口Car</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface Car{</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**行驶*/&nbsp;&nbsp;&nbsp;&nbsp;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void drive();</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp; 2)宝马和奔驰汽车对象</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class BMWCar implements Car {</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**<br />* 汽车发动<br />*/<br />public void drive(){<br />&nbsp;&nbsp; System.out.println("BMW Car drive");<br />}<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class BengCar implements Car {</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">/**<br />* 汽车发动<br />*/<br />public void drive(){<br />&nbsp;&nbsp; System.out.println("BengChi Care drive");<br />}<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 3)单独一个汽车工厂来负责创建</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp; public class FactoryCar {<br />/**<br />* 制造汽车<br />*<br />* @param company 汽车公司<br />* @return 汽车<br />* @throws CreateCarException 制造汽车失败异常<br />*/<br />public static Car createCar(Company company)throws CreateCarException{<br />&nbsp;&nbsp; if(company==Company.BMW){<br />&nbsp;&nbsp;&nbsp; return new BMWCar();<br />&nbsp;&nbsp; }else if(company==Company.Beng){<br />&nbsp;&nbsp;&nbsp; return new BengCar();<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp; return null;<br />}<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; 4）最后的代码实现：</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; Car BMWCar=FactoryCar.createCar(Company.BMW);<br />&nbsp;&nbsp;&nbsp;&nbsp; BMWCar.drive();</p><img src ="http://www.blogjava.net/mikechen/aggbug/384931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2012-08-06 17:28 <a href="http://www.blogjava.net/mikechen/archive/2012/08/06/384931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式我的理解</title><link>http://www.blogjava.net/mikechen/archive/2012/08/06/384928.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Mon, 06 Aug 2012 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2012/08/06/384928.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/384928.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2012/08/06/384928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/384928.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/384928.html</trackback:ping><description><![CDATA[<p style="margin: 0px; font-family: 微软雅黑, 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; ">&nbsp; &nbsp;1. 我说下我对设计模式的理解：任何一样事物都是因为有需求的驱动才诞生的，所以设计模式也不例外，我们平时在编写代码的时候，随着时间的深入，发现很多代码很难维护，可扩展性级差，以及代码的效率也比较低，这个时候你肯定会想办法让代码变的优美又能解决你项目中的问题，所以在面向对象语言里，你肯定会去发现很多可以重用的公用的方法，比如：接口的存在，你自然就想到了，让你定义的方法与你的实现分开，也可以很方便把不同的类与接口匹配起来，形成了一个公用的接口，你会发现这样做，好处会是非常多的，解决了你平时想把代码的申明与逻辑实现的分开。</p><p style="margin: 0px; font-family: 微软雅黑, 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; ">&nbsp;&nbsp;&nbsp; 2. 这个时候，你发现了，本身面向对象的语言里，已经暗藏了很多好处，你肯定会仔细去分析面向对象这个语言，认真去挖掘里面更多的奥秘，最后，你发现了，原来你可以把面向对象的特性提取成一个公用的实现案例，这些案例里能帮助你解决你平时编写代码的困扰，而这样一群人，就是所谓gof的成员，他们从平时设计建筑方面找到了灵感，建筑的设计也可以公用化以及重用化，所以他们也提取了相关的软件设计方面的公用案例，也就有了下面的相关的所谓23种设计模式，而里面这么多模式，你也可以把他们归类起来，最后发现就几类模式：创建，结构，行为等模式类别，而这些现成的方案，也可以在实际应用中充分发挥作用，随着大家的使用以及理解，发现其实这些所谓的模式里，你的确可以让你的代码变的更加优美与简练。</p><p style="margin: 0px; font-family: 微软雅黑, 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; ">&nbsp;&nbsp;&nbsp; 3. 我比较喜欢把代码变的更加优美与简练，优美的代码就是一看就懂，结构很清晰，而简历就是一目了然，又可以解决你的问题，就是代码又少效率又高，所以平时要养成写java doc的习惯，这样的代码才为清晰，所以才会更加优美。</p><p style="margin: 0px; font-family: 微软雅黑, 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; ">&nbsp;&nbsp;&nbsp; 4. 这些就是我对设计模式的理解，所以这么好的宝贝，我们不去深入的了解，的确可惜了，这就叫站到巨人的肩膀上.....</p><img src ="http://www.blogjava.net/mikechen/aggbug/384928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2012-08-06 17:22 <a href="http://www.blogjava.net/mikechen/archive/2012/08/06/384928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>操作系统-linux常用命令</title><link>http://www.blogjava.net/mikechen/archive/2012/07/24/383815.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Tue, 24 Jul 2012 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2012/07/24/383815.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/383815.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2012/07/24/383815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/383815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/383815.html</trackback:ping><description><![CDATA[<div><strong>一：网络配置</strong></div><span style="white-space: pre; "><div style="text-align: left;">		<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.关掉防火墙 &nbsp; &nbsp;</div></span><span style="white-space: pre; "><div style="text-align: left;">	1) 重启后生效&nbsp;</div></span><span style="white-space: pre; "><div style="text-align: left;">		开启： chkconfig iptables on&nbsp;</div></span><span style="white-space: pre; "><div style="text-align: left;">		关闭： chkconfig iptables off&nbsp;</div></span><span style="white-space: pre; "><div style="text-align: left;">			</div></span><span style="white-space: pre; "><div style="text-align: left;">	2) 即时生效，重启后失效&nbsp;</div></span><span style="white-space: pre; "><div style="text-align: left;">		开启： service iptables start&nbsp;</div></span><span style="white-space: pre; "><div style="text-align: left;">		关闭： service iptables stop</div></span><span style="white-space: pre; "><div style="text-align: left;">		</div></span><span style="white-space: pre; "><div style="text-align: left;">&nbsp;&nbsp;&nbsp;&nbsp;2.下载软件</div></span><span style="white-space: pre; "><div style="text-align: left;">	wget curl	</div></span><span style="white-space: pre; "><div style="text-align: left;">			</div></span><span style="white-space: pre; "><div style="text-align: left;">&nbsp;&nbsp;&nbsp;&nbsp;3.安装和解压</div></span><span style="white-space: pre; "><div style="text-align: left;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;安装	rpm -ivh</div></span><span style="white-space: pre; "><div style="text-align: left;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;升级	rpm -Uvh</div></span><span style="white-space: pre; "><div style="text-align: left;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;卸载	rpm -e</div></span><span style="white-space: pre; "><div style="text-align: left;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tar -zxvf&nbsp;</div></span><div style="text-align: left;">　　</div><div></div><div><strong>二：网卡设置</strong></div><div></div><div><span style="white-space:pre">	</span>　 &nbsp;1、 设置ip地址（即时生效，重启失效）</div><div><span style="white-space:pre">	</span>　　#ifconfig eth0 ip地址 netmask 子网掩码</div><div><span style="white-space:pre">	</span>　　</div><div><span style="white-space:pre">	</span>　　2、 设置ip地址（重启生效，永久生效）</div><div><span style="white-space:pre">	</span>　　#setup</div><div><span style="white-space:pre">	</span>　　</div><div><span style="white-space:pre">	</span>　　3、 通过配置文件设置ip地址（重启生效，永久生效）</div><div><span style="white-space:pre">	</span>　　#vi /etc/sysconfig/network-scripts/ifcfg-eth0</div><div><span style="white-space:pre">	</span>　　DEVICE=eth0 #设备名，与文件同名。</div><div><span style="white-space:pre">	</span>　　ONBOOT=yes #在系统启动时，启动本设备。</div><div><span style="white-space:pre">	</span>　　BOOTPROTO=static</div><div><span style="white-space:pre">	</span>　　IPADDR=202.118.75.91 #此网卡的IP地址</div><div><span style="white-space:pre">	</span>　　NETMASK=255.255.255.0 #子网掩码</div><div><span style="white-space:pre">	</span>　　GATEWAY=202.118.75.1 #网关IP</div><div><span style="white-space:pre">	</span>　　MACADDR=00:02:2D:2E:8C:A8 #mac地址</div><div><span style="white-space:pre">	</span>　　</div><div><span style="white-space:pre">	</span>　　4、 重启网络服务</div><div><span style="white-space:pre">	</span>　　#service network restart //重启所有网卡</div><div><span style="white-space:pre">	</span>　　</div><div><span style="white-space:pre">	</span>　　5、 禁用网卡,启动网卡</div><div><span style="white-space:pre">	</span>　　#ifdown eth0</div><div><span style="white-space:pre">	</span>　　#ifup eth0</div><div><span style="white-space:pre">	</span>　　</div><div><span style="white-space:pre">	</span>　　6、 屏蔽网卡，显示网卡</div><div><span style="white-space:pre">	</span>　　#ifconfig eth0 down</div><div><span style="white-space:pre">	</span>　　#ifconfig eth0 up</div><div><span style="white-space:pre">	</span>　　</div><div><span style="white-space:pre">	</span>　　7、 配置DNS客户端（最多三个）</div><div><span style="white-space:pre">	</span>　　#vi /etc/resolv.conf</div><div><span style="white-space:pre">	</span>　　nameserver 202.99.96.68</div><div><span style="white-space:pre">	</span>　　</div><div><span style="white-space:pre">	</span>　　8、更改主机名（即时生效）</div><div><span style="white-space:pre">	</span>　　#hostname 主机名</div><div><span style="white-space:pre">	</span>　　</div><div><span style="white-space:pre">	</span>　　9、更改主机名（重启计算机生效，永久生效）</div><div><span style="white-space:pre">	</span>　　#vi /etc/sysconfig/network</div><div><span style="white-space:pre">	</span>　　HOSTNAME=主机名<br /></div><div></div><div><strong>三：两台linux拷贝命令：scp<br /><br /></strong></div><div></div><div><span style="white-space:pre">	</span>1.安装scp:yum install openssh-clients&nbsp;</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span>2.scp &nbsp;-r 本地用户名@IP地址:文件名1 远程用户名@IP地址:文件名2</div><div><span style="white-space:pre">		</span></div><img src ="http://www.blogjava.net/mikechen/aggbug/383815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2012-07-24 10:28 <a href="http://www.blogjava.net/mikechen/archive/2012/07/24/383815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>服务器-Nginx</title><link>http://www.blogjava.net/mikechen/archive/2012/07/06/382346.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Fri, 06 Jul 2012 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2012/07/06/382346.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/382346.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2012/07/06/382346.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/382346.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/382346.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 作者:NetSeek http://www.linuxtone.org (IT运维专家网|集群架构|性能调优)欢迎转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明.首发时间: 2008-11-25 更新时间:2009-1-14目 录一、 Nginx 基础知识二、 Nginx 安装及调试三、 Nginx Rewrite四、 Nginx Redirect五、 Nginx 目录自动加斜线...&nbsp;&nbsp;<a href='http://www.blogjava.net/mikechen/archive/2012/07/06/382346.html'>阅读全文</a><img src ="http://www.blogjava.net/mikechen/aggbug/382346.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2012-07-06 11:09 <a href="http://www.blogjava.net/mikechen/archive/2012/07/06/382346.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>框架-quartz</title><link>http://www.blogjava.net/mikechen/archive/2012/07/03/382090.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Tue, 03 Jul 2012 06:42:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2012/07/03/382090.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/382090.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2012/07/03/382090.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/382090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/382090.html</trackback:ping><description><![CDATA[<strong style="font-size: 12pt; ">一：quartz简介</strong><br style="font-size: 10pt; " /><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp;OpenSymphony 的Quartz提供了一个比较完美的任务调度解决方案。</span><div style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp;Quartz 是个开源的作业调度框架，定时调度器，为在 Java 应用程序中进行作业调度提供了简单却强大的机制。</div><div style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp;Quartz中有两个基本概念：作业和触发器。作业是能够调度的可执行任务，触发器提供了对作业的调度<br /><br /><strong style="font-size: 12pt; ">二：quartz spring配置详解</strong><br /><ul><li>&nbsp;<strong>为什么不适用<span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 23px; text-align: left; background-color: #d6d3d6; ">java.util.Timer结合java.util.TimerTask</span>&nbsp;</strong></li></ul>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.主要的原因，适用不方便，特别是制定具体的年月日时分的时间，而quartz使用类似linux上的cron配置，很方便的配置每隔时间执行触发。<br /><br />&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;2.其次性能的原因，使用jdk自带的Timer不具备多线程，而quartz采用线程池，性能上比timer高出很多。<br /><br /><br /><ul><li>&nbsp; &nbsp;<strong>详解quartz在spring里面的配置</strong></li></ul>&nbsp; &nbsp; 在spring里主要分为两种使用方式：第一种，也是目前使用最多的方式，spring提供的MethodInvokingJobDetailFactoryBean代理类，通过雷利类直接调用任务类的某个函数；第二种,程序里实现quartz接口，quartz通过该接口进行调度。<br /><br />&nbsp; &nbsp; &nbsp; <strong>主要讲解通过spring提供的代理类MethodInvokingJobDetailFactoryBean</strong><br /><br />&nbsp;<strong> &nbsp; &nbsp; &nbsp; 1.业务逻辑类:业务逻辑是独立的，本身就与quartz解耦的，并没有深入进去，这对业务来讲是很好的一个方式。<br /></strong><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff; ">public</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;</span><span style="font-size: 13px; color: #0000ff; ">class</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;&nbsp;TestJobTask{</span><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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*业务逻辑处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;&nbsp;&nbsp;service(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">业务逻辑</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" />..<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div>&nbsp; &nbsp; &nbsp; &nbsp;<br /><strong>&nbsp; &nbsp; 2.增加一个线程池</strong><br />&nbsp; &nbsp;&nbsp;<span style="font-size: 13px; color: #008000; ">&lt;!--</span><span style="font-size: 13px; color: #008000; ">&nbsp;线程执行器配置，用于任务注册&nbsp;</span><span style="font-size: 13px; color: #008000; ">--&gt;</span><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"><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="executor"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="corePoolSize"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="10"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="maxPoolSize"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="100"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="queueCapacity"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="500"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span></div><br /><strong>&nbsp; 3.定义业务逻辑类<br /></strong><br />&nbsp; &nbsp;&nbsp;<span style="font-size: 13px; color: #008000; ">&lt;!--</span><span style="font-size: 13px; color: #008000; ">&nbsp;业务对象&nbsp;</span><span style="font-size: 13px; color: #008000; ">--&gt;</span><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="testJobTask"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="com.mike.scheduling.TestJobTask"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span></div><br /><br /><strong>&nbsp; &nbsp; 4.增加quartz调用业务逻辑<br /></strong><br />&nbsp; &nbsp;&nbsp;<span style="font-size: 13px; color: #008000; ">&lt;!--</span><span style="font-size: 13px; color: #008000; ">&nbsp;调度业务&nbsp;</span><span style="font-size: 13px; color: #008000; ">--&gt;</span><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"><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="jobDetail"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="targetObject"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="testJobTask"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="targetMethod"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="service"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span></div><br />&nbsp; &nbsp; <strong>5.增加调用的触发器，触发的时间，有两种方式：<br /></strong><br />&nbsp; &nbsp; &nbsp;<strong>第一种触发时间，采用类似linux的cron，配置时间的表示发出丰富 </strong>&nbsp;<br /><span style="font-size: 13px; color: #0000ff; ">&nbsp; &lt;</span><span style="font-size: 13px; color: #800000; ">bean&nbsp;</span><span style="font-size: 13px; color: #ff0000; ">id</span><span style="font-size: 13px; color: #0000ff; ">="cronTrigger"</span><span style="font-size: 13px; color: #ff0000; ">&nbsp;class</span><span style="font-size: 13px; color: #0000ff; ">="org.springframework.scheduling.quartz.CronTriggerBean"</span><span style="font-size: 13px; color: #0000ff; ">&gt;</span><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">&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="jobDetail"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="jobDetail"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="cronExpression"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="10&nbsp;0/1&nbsp;*&nbsp;*&nbsp;*&nbsp;?"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000ff; ">&gt;</span></div>&nbsp;&nbsp;<span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 23px; text-align: left; background-color: #d6d3d6; ">Cron表达式&#8220;10 */1 * * * ?&#8221;意为：从10秒开始，每1分钟执行一次</span>&nbsp;<br />&nbsp;&nbsp;<br />&nbsp; &nbsp; 第二种，采用比较简话的方式，申明延迟时间和间隔时间<br /><span style="font-size: 13px; color: #0000ff; ">&nbsp; &lt;</span><span style="font-size: 13px; color: #800000; ">bean&nbsp;</span><span style="font-size: 13px; color: #ff0000; ">id</span><span style="font-size: 13px; color: #0000ff; ">="taskTrigger"</span><span style="font-size: 13px; color: #ff0000; ">&nbsp;class</span><span style="font-size: 13px; color: #0000ff; ">="org.springframework.scheduling.quartz.SimpleTriggerBean"</span><span style="font-size: 13px; color: #0000ff; ">&gt;</span><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">&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="jobDetail"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="jobDetail"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="startDelay"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="10000"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="repeatInterval"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="60000"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span></div>&nbsp;&nbsp;<span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 23px; text-align: left; background-color: #d6d3d6; ">延迟10秒启动，然后每隔1分钟执行一次</span>&nbsp;<br /><br />&nbsp; &nbsp;<strong> 6.开始调用<br /></strong><br />&nbsp; &nbsp; &nbsp;&nbsp;<span style="font-size: 13px; color: #008000; ">&lt;!--</span><span style="font-size: 13px; color: #008000; ">&nbsp;设置调度&nbsp;</span><span style="font-size: 13px; color: #008000; ">--&gt;</span><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"><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="org.springframework.scheduling.quartz.SchedulerFactoryBean"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="triggers"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">ref&nbsp;</span><span style="color: #FF0000; ">bean</span><span style="color: #0000FF; ">="cronTrigger"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="taskExecutor"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="executor"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span></div><br /><strong>&nbsp; &nbsp;7.结束：启动容器即可，已经将spring和quartz结合完毕。</strong><br /><br />&nbsp; <strong>&nbsp; Cron常用的表达式</strong><br />&nbsp; &nbsp;&nbsp;<span style="background-color: #eeeeee; font-size: 13px; ">"0&nbsp;0&nbsp;12&nbsp;*&nbsp;*&nbsp;?"&nbsp;每天中午12点触发</span><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">"0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;*"&nbsp;每天上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;*&nbsp;*&nbsp;?"&nbsp;每天上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;*&nbsp;*&nbsp;?&nbsp;*"&nbsp;每天上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;*&nbsp;*&nbsp;?&nbsp;2005"&nbsp;2005年的每天上午10:15触发<br />"0&nbsp;*&nbsp;14&nbsp;*&nbsp;*&nbsp;?"&nbsp;在每天下午2点到下午2:59期间的每1分钟触发<br />"0&nbsp;0/5&nbsp;14&nbsp;*&nbsp;*&nbsp;?"&nbsp;在每天下午2点到下午2:55期间的每5分钟触发<br />"0&nbsp;0/5&nbsp;14,18&nbsp;*&nbsp;*&nbsp;?"&nbsp;在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发<br />"0&nbsp;0-5&nbsp;14&nbsp;*&nbsp;*&nbsp;?"&nbsp;在每天下午2点到下午2:05期间的每1分钟触发<br />"0&nbsp;10,44&nbsp;14&nbsp;?&nbsp;3&nbsp;WED"&nbsp;每年三月的星期三的下午2:10和2:44触发<br />"0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;MON-FRI"&nbsp;周一至周五的上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;15&nbsp;*&nbsp;?"&nbsp;每月15日上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;L&nbsp;*&nbsp;?"&nbsp;每月最后一日的上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;6L"&nbsp;每月的最后一个星期五上午10:15触发&nbsp;<br />"0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;6L&nbsp;2002-2005"&nbsp;2002年至2005年的每月的最后一个星期五上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;6#3"&nbsp;每月的第三个星期五上午10:15触发</div><br /><strong style="font-size: 12pt; ">三：quartz原理<br /></strong><br />&nbsp; &nbsp; <strong>根据上面spring的配置，我们就比较清楚quartz的内部情况，下面我们主要详解配置涉及到的每个点</strong><br />&nbsp; &nbsp; 1.我们先从最后一个步骤看起，<span style="font-family: 宋体, arial, serif; font-size: 14px; line-height: 24px; background-color: #f5f8fd; ">SchedulerFactoryBean</span>&nbsp;，scheduler的工厂实现，里面可以生产出对应的多个jobDetail和trigger，每个jobDetail对应trigger代表一个任务<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">&nbsp;Quartz的SchedulerFactory是标准的工厂类，不太适合在Spring环境下使用。此外，为了保证Scheduler能够感知 Spring容器的生命周期，完成自动启动和关闭的操作，必须让Scheduler和Spring容器的生命周期相关联。以便在Spring容器启动后， Scheduler自动开始工作，而在Spring容器关闭前，自动关闭Scheduler。为此，Spring提供 SchedulerFactoryBean，这个FactoryBean大致拥有以下的功能：&nbsp;</span><div>&nbsp; &nbsp; &nbsp;1)以更具Bean风格的方式为Scheduler提供配置信息；&nbsp;</div><div>&nbsp; &nbsp; &nbsp;2)让Scheduler和Spring容器的生命周期建立关联，相生相息；&nbsp;</div><div>&nbsp; &nbsp; &nbsp;3)通过属性配置部分或全部代替Quartz自身的配置文件。&nbsp;</div><div>&nbsp; 2.jobDetail,表示一个可执行的业务调用<br />&nbsp;&nbsp;<br />&nbsp; 3.trigger:调度的时间计划，什么时候，每隔多少时间可执行等时间计划<br /><br />&nbsp; 4.<span style="font-size: 10pt; "></span><span style="font-size: 10pt; ">ThreadPoolTaskExecutor，线程池，用来并行执行每个对应的job，提高效率，这也是上面提到不推荐使用jdk自身timer的一个很重要的原因</span></div><div></div></div><img src ="http://www.blogjava.net/mikechen/aggbug/382090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2012-07-03 14:42 <a href="http://www.blogjava.net/mikechen/archive/2012/07/03/382090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>