﻿<?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-java技术-随笔分类-java</title><link>http://www.blogjava.net/fuhoujun/category/35046.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 03 Jul 2017 10:33:25 GMT</lastBuildDate><pubDate>Mon, 03 Jul 2017 10:33:25 GMT</pubDate><ttl>60</ttl><item><title>开源JEE框架　(Bootstrap javascript  spring boot)</title><link>http://www.blogjava.net/fuhoujun/archive/2016/06/13/430865.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Mon, 13 Jun 2016 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2016/06/13/430865.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/430865.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2016/06/13/430865.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/430865.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/430865.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: * 此框架采用前后台分开，前后台都可以单独部署，前端采用轻量级的扁平化设计（html+javascript+Bootstrap）, 会自动针对不同的屏幕尺寸调整页面，使其在各个尺寸的屏幕上表现良好。<br>* 后端采用Spring boot，它使我们更容易去创建基于Spring的独立和产品级的可以即时运行的应用和服务。直接嵌入Tomcat 或Jetty服务器，不需要部署WAR 文件，可直接运行jar文件。<br>* 系统权限框架采用Shiro，实现前后台权限校验 * 持久层采用JPA ，并实现类ibatis的查询功能；数据响应该采用json格式。<br>* 服务采用REST形式，能够方便的与手机app进行对接，集成swagger能够在线查看RESTAPI 文档和在线测试服务接口<br>* 支持单点登录，可以多系统进行菜单集成，形成一个portal<br>* 支持高并发和水平扩展，支持Session的统一存储<br>* 项目采用gradle构建，能够方便的将各项目进行按需组装&nbsp;&nbsp;<a href='http://www.blogjava.net/fuhoujun/archive/2016/06/13/430865.html'>阅读全文</a><img src ="http://www.blogjava.net/fuhoujun/aggbug/430865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2016-06-13 10:00 <a href="http://www.blogjava.net/fuhoujun/archive/2016/06/13/430865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java NIO</title><link>http://www.blogjava.net/fuhoujun/archive/2008/10/21/235733.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Tue, 21 Oct 2008 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2008/10/21/235733.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/235733.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2008/10/21/235733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/235733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/235733.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: java nio的全称是java new I/O，即一个全新的I/O控制系统，它的API的包名为java.nio，是在jdk1.4后引入的。nio之所以为为新，在于它并没在原来I/O的基础上进行开发，而是提供了全新的类和接口，除了原来的基本功能之外，它还提供了以下新的特征：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ►&nbsp;多路选择的非封锁式...&nbsp;&nbsp;<a href='http://www.blogjava.net/fuhoujun/archive/2008/10/21/235733.html'>阅读全文</a><img src ="http://www.blogjava.net/fuhoujun/aggbug/235733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-21 17:44 <a href="http://www.blogjava.net/fuhoujun/archive/2008/10/21/235733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>轻松实现Apache,Tomcat集群和负载均衡</title><link>http://www.blogjava.net/fuhoujun/archive/2008/10/20/235373.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Mon, 20 Oct 2008 00:49:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2008/10/20/235373.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/235373.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2008/10/20/235373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/235373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/235373.html</trackback:ping><description><![CDATA[&nbsp;作者:罗代均 ldj_work#126.com,转载请保持完整性<br />
环境说明
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Apache&nbsp; :apache_2.0.55&nbsp;&nbsp;&nbsp;&nbsp; 1 个</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tomcat:&nbsp; apache-tomcat-5.5.17 (zip版) 2个</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mod_jk:: mod_jk-apache-2.0.55.so&nbsp; 1个</p>
<p><strong>第一部分：负载均衡</strong></p>
<p>&nbsp;&nbsp;&nbsp; 负载均衡，就是apache将客户请求均衡的分给tomcat1,tomcat2....去处理</p>
<p><strong>&nbsp;&nbsp; 1.安装apche,tomcat</strong></p>
<p>&nbsp;&nbsp; <a href="http://httpd.apache.org/">http://httpd.apache.org/</a>&nbsp;下载Apache 2.0.55</p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://tomcat.apache.org/download-55.cgi">http://tomcat.apache.org/download-55.cgi</a>&nbsp;下载tomcat5.5 zip版本（解压即可，绿色版）</p>
<p>&nbsp;&nbsp; <a href="http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/">http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/</a>&nbsp; 下载mod_jk,注意和&nbsp; apache版本匹配</p>
<p>&nbsp;&nbsp; 按照jdk,我的路径为:E:\ide\apache\Apache2</p>
<p>&nbsp;&nbsp; 解压两份Tomcat, 路径分别为 E:\ide\tomcat1,E:\ide\tomcat2</p>
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/9d61f003d5034eec09fa935b.jpg" border="0" small="0"  alt="" /></div>
<p>下载mod_jk</p>
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/52855e82373a3ea20df4d224.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/46899c50d44e3b628435245b.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1"></div>
<div forimg="1"></div>
<p><strong>2.修改Apache配置文件http.conf</strong></p>
<p>&nbsp;&nbsp; 在apache安装目录下conf目录中找到http.conf</p>
<p>&nbsp;&nbsp; 在文件最后加上下面一句话就可以了</p>
<p>&nbsp; include "E:\ide\apache\Apache2\conf\mod_jk.conf"</p>
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/d1c28cd49b8d6901a08bb720.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>2. http.conf 同目录下新建mod_jk.conf文件，内容如下</strong></div>
<div forimg="1">&nbsp;&nbsp; </div>
<div forimg="1">#加载mod_jk Module<br />
LoadModule jk_module modules/mod_jk-apache-2.0.55.so</div>
<div forimg="1"></div>
<div forimg="1">#指定 workers.properties文件路径<br />
JkWorkersFile conf/workers.properties</div>
<div forimg="1"></div>
<div forimg="1">#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器</div>
<div forimg="1">JkMount /*.jsp controller</div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>3.在http.conf同目录下新建 workers.properties文件，内容如下</strong></div>
<div forimg="1">&nbsp;</div>
<div forimg="1">worker.list = controller,tomcat1,tomcat2&nbsp; #server 列表</div>
<div forimg="1"></div>
<div forimg="1">#========tomcat1========</div>
<div forimg="1">worker.tomcat1.port=8009&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #ajp13 端口号，在tomcat下server.xml配置,默认8009<br />
worker.tomcat1.host=localhost&nbsp; #tomcat的主机地址，如不为本机，请填写ip地址<br />
worker.tomcat1.type=ajp13<br />
worker.tomcat1.lbfactor = 1&nbsp;&nbsp; #server的加权比重，值越高，分得的请求越多</div>
<div forimg="1"></div>
<div forimg="1">#========tomcat2========</div>
<div forimg="1">worker.tomcat2.port=9009&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #ajp13 端口号，在tomcat下server.xml配置,默认8009<br />
worker.tomcat2.host=localhost&nbsp; #tomcat的主机地址，如不为本机，请填写ip地址<br />
worker.tomcat2.type=ajp13<br />
worker.tomcat2.lbfactor = 1&nbsp;&nbsp; #server的加权比重，值越高，分得的请求越多</div>
<div forimg="1"><br />
#========controller,负载均衡控制器========<br />
worker.controller.type=lb<br />
worker.controller.balanced_workers=tomcat1,tomcat2&nbsp;&nbsp; #指定分担请求的tomcat<br />
worker.controller.sticky_session=1</div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>4.修改tomcat配置文件server.xml</strong></div>
<div forimg="1">如果你在不同电脑上安装tomcat,tomcat的安装数量为一个，可以不必修改tomcat配置文件</div>
<div forimg="1">我这里是在同一台电脑上安装两个tomcat，所以需要更改其中一个的设置</div>
<div forimg="1"></div>
<div forimg="1">打开tomcat2/conf/server.xml文件</div>
<div forimg="1">
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/a3d133a8ed4063b1ca130c36.jpg" border="0" small="0"  alt="" />
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/8c3cae7727b25d1bb151b937.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1">
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/56b04b085ba7f3950b7b8230.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>5.编写一个测试jsp</strong></div>
<div forimg="1"></div>
<div forimg="1">建立一个目录test.里面新建一个test.jsp,内容为</div>
<div forimg="1"></div>
<div forimg="1">&lt;% <br />
&nbsp;&nbsp; System.out.println("===========================");<br />
%&gt;<br />
</div>
<div forimg="1">把test放到tomcat1,tomcat2的webapps下</div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>6.启动apache,tomcat1,tomcat2,进行测试</strong></div>
<div forimg="1"></div>
<div forimg="1">通过 <a href="http://localhost/test/test.jsp">http://localhost/test/test.jsp</a>&nbsp;访问，查看tomcat1的窗口，可以看到打印了一行"=========="</div>
<div forimg="1">再刷新一次，tomcat2也打印了一条，再刷新，可以看到请求会被tomcat1,tomcat2轮流处理,实现了负载均衡</div>
<div forimg="1">
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/acf2fcf2c8b77d13b17ec53d.jpg" width="830" border="0" small="0"  alt="" /></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>第二部分，配置集群</strong></div>
<div forimg="1">&nbsp;&nbsp; 只配置负载均衡还不行，还要session复制，也就是说其中任何一个tomcat的添加的session，是要同步复制到其它tomcat， 集群内的tomcat都有相同的session</div>
<div forimg="1"></div>
<div forimg="1"><strong>1. 修改tomcat1, tomcat2的server.xml</strong>,将集群部分配置的在注释符删掉,并将tomcat2的4001端口改为4002，以避免与tomcat冲突，当然，如果是两台电脑，是不用改端口的，去掉注释符即可</div>
<div forimg="1">&nbsp;&nbsp;
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/aa4ab5fb0f3582224f4aeab2.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1">
<div forimg="1">
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/89b84c3627ecc1dda3cc2b92.jpg" border="0" small="0"  alt="" /></div>
</div>
<div forimg="1">
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/cc4b858b603d47d3fd1f10b2.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/52dfdac4bc506ecb38db4959.jpg" border="0" small="0"  alt="" /></div>
</strong></div>
<div forimg="1"><strong></strong></div>
<div forimg="1"><strong>2，修改测试项目test</strong></div>
<div forimg="1">修改test.jsp,内容如下</div>
<div forimg="1"></div>
<div forimg="1">&nbsp; &lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />
&lt;%@ page import="java.util.*" %&gt;<br />
&lt;html&gt;&lt;head&gt;&lt;title&gt;Cluster App Test&lt;/title&gt;&lt;/head&gt;<br />
&lt;body&gt;<br />
Server Info:<br />
&lt;%<br />
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"&lt;br&gt;");%&gt;<br />
&lt;%<br />
&nbsp; out.println("&lt;br&gt; ID " + session.getId()+"&lt;br&gt;");</div>
<div forimg="1">&nbsp; // 如果有新的 Session 属性设置<br />
&nbsp; String dataName = request.getParameter("dataName");<br />
&nbsp; if (dataName != null &amp;&amp; dataName.length() &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; String dataValue = request.getParameter("dataValue");<br />
&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute(dataName, dataValue);<br />
&nbsp; }</div>
<div forimg="1">&nbsp; out.print("&lt;b&gt;Session 列表&lt;/b&gt;");</div>
<div forimg="1">&nbsp; Enumeration e = session.getAttributeNames();<br />
&nbsp; while (e.hasMoreElements()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; String name = (String)e.nextElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp; String value = session.getAttribute(name).toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp; out.println( name + " = " + value+"&lt;br&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( name + " = " + value);<br />
&nbsp;&nbsp; }<br />
%&gt;<br />
&nbsp; &lt;form action="index.jsp" method="POST"&gt;<br />
&nbsp;&nbsp;&nbsp; 名称:&lt;input type=text size=20 name="dataName"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; 值:&lt;input type=text size=20 name="dataValue"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;input type=submit&gt;<br />
&nbsp;&nbsp; &lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</div>
<div forimg="1"></div>
<div forimg="1">然后在test 新建WEB-INF目录，WEB-INF下新建web.xml,内容如下</div>
<div forimg="1">&lt;web-app xmlns="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>" xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> <a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>" version="2.4"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display-name&gt;TomcatDemo&lt;/display-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#ff0000"> &lt;distributable/&gt;</font></strong><br />
&lt;/web-app&gt;</div>
<div forimg="1"></div>
<div forimg="1">注意：在你的应用的web.xml加入&nbsp;<font color="#ff0000"><strong> &lt;distributable/&gt;</strong> </font><font color="#000000">即可</font></div>
<div forimg="1"></div>
<div forimg="1">ok,讲test复制到tomcat1,tomcat2的webapps下，重启apache,tomcat1,tomcat2,</div>
<div forimg="1">输入网址 <a href="http://localhost/test/test.jsp">http://localhost/test/test.jsp</a>&nbsp;&nbsp; </div>
<div forimg="1"></div>
<div forimg="1">新建一个 名称为 xiaoluo&nbsp; ,值为 cdut 的session,提交查询，新开一个ie窗口，再提交查询，如图，可以看到，两个tomcat 是负载均衡，并且session同步的</div>
<div forimg="1">
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/79a9317af99aa5ed2e73b385.jpg" width="830" border="0" small="0"  alt="" /></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/fuhoujun/aggbug/235373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-20 08:49 <a href="http://www.blogjava.net/fuhoujun/archive/2008/10/20/235373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java下的框架编程之cglib的应用</title><link>http://www.blogjava.net/fuhoujun/archive/2008/10/08/233074.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Wed, 08 Oct 2008 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2008/10/08/233074.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/233074.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2008/10/08/233074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/233074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/233074.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="96%" align="center" border="0">
    <tbody>
        <tr>
            <td class="d_font3" valign="bottom" align="center" height="24">Java下的框架编程之cglib的应用</td>
        </tr>
        <tr>
            <td bgcolor="#e3e3e3" height="3"></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td class="d_font4">
            <p>Proxy可以看作是微型的AOP，明白提供了在继承和委托之外的第三个代码封装途径，只要有足够的想象力，可以做得非常好玩，Spring的源码里用Proxy就用得很随便，看得我非常眼红。可惜Proxy必须基于接口。因此Spring的做法，基于接口的用proxy,否则就用cglib。AOP么，一般小事非compoent一级的就不麻烦AspectJ出手了。</p>
            <p>cglib的Enhancer说起来神奇，用起来一页纸不到就讲完了。</p>
            <p>它的原理就是用Enhancer生成一个原有类的子类，并且设置好callback到proxy， 则原有类的每个方法调用都会转为调用实现了MethodInterceptor接口的proxy的intercept()&nbsp;函数：</p>
            <p>
            <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
                <tbody>
                    <tr>
                        <td class="code" bgcolor="#e6e6e6">
                        <pre>
                        <p><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;intercept(Object&nbsp;o,Method&nbsp;method,Object[]&nbsp;args,MethodProxy&nbsp;proxy)</span></p>
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            </p>
            在intercept()函数里，你可以在执行Object result=proxy.invokeSuper(o,args);来执行原有函数，在执行前后加入自己的东西，改变它的参数值，也可以瞒天过海，完全干别的。说白了，就是AOP中的around advice。 <br />
            <p>AOP没有出现以前，该领域经典的设计模式是Decorator，像Java IO Stream的设计就是如此。不过，如果为每个DAO, 每个方法的写Decorator函数会写死人的，所以用上cglib的好处是一次过拦截所有方法。&nbsp;<br />
            <br />
            另外，cglib除了Enhancer之外，还有BulkBean和Transform，都是Hibernate持久化的基础，但文档贫乏，一时还没去看怎么用。<br />
            <br />
            1.AOP里讲了一百遍啊一百遍的log aspect在cglib是这样做的：</p>
            <p>
            <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
                <tbody>
                    <tr>
                        <td class="code" bgcolor="#e6e6e6">
                        <pre>
                        <p><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LogDAOProxy&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;MethodInterceptor<br />
                        &nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Logger&nbsp;log</span><span style="color: #000000">=</span><span style="color: #000000">Logger.getLogger(LogDAOProxy.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Enhancer&nbsp;enhancer</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Enhancer();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回DAO的子类</span><span style="color: #008000"><br />
                        </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;getDAO(Class&nbsp;clz)<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setSuperclass(clz);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setCallback(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;enhancer.create();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//默认</span><span style="color: #008000">的拦截方法</span><span style="color: #008000"><br />
                        </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;intercept(Object&nbsp;o,Method&nbsp;method,Object[]&nbsp;args,</span></p>
                        <p><span style="color: #000000">        MethodProxy&nbsp;proxy)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Throwable<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span style="color: #000000">"</span><span style="color: #000000">调用日志方法</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">method.getName());<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result</span><span style="color: #000000">=</span><span style="color: #000000">proxy.invokeSuper(o,args);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        &nbsp;&nbsp;&nbsp;}</span></p>
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            应用的代码：</p>
            <p>
            <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
                <tbody>
                    <tr>
                        <td class="code" bgcolor="#e6e6e6">
                        <pre>
                        <p>LogDAOProxy&nbsp;proxy&nbsp;<span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;LogDAOProxy();<br />
                        &nbsp;&nbsp;GoodsDAO&nbsp;&nbsp;dao&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(GoodsDAO)proxy.getDAO(GoodsDAO.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
                        &nbsp;&nbsp;dao.insert(goods);</span></p>
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            2.而在Spring的管理下应该略加修改的高级Decorator</p>
            <p>上面的例子用<span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;enhancer.create();创建子类实例，但在Spring管理下，一些Bean的实例必须由Spring来创建和管理，而不由enhancer来创建的。所以我对上述用法略加修改，使它真正当一个Proxy的角色，请对比黑体字的部分。</span></p>
            <p><span style="color: #000000">
            <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
                <tbody>
                    <tr>
                        <td class="code" bgcolor="#e6e6e6">
                        <pre>
                        <p><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LogDAOProxy&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;MethodInterceptor<br />
                        &nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Logger&nbsp;log</span><span style="color: #000000">=</span><span style="color: #000000">Logger.getLogger(LogDAOProxy.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Object&nbsp;dao</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Enhancer&nbsp;enhancer</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Enhancer();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回DAO的子类</span><span style="color: #008000"><br />
                        </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;getDAO(Class&nbsp;clz,Object&nbsp;dao)<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.dao&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dao;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setSuperclass(clz);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setCallback(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;enhancer.create();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">默认的拦截方法</span><span style="color: #008000"><br />
                        </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;intercept(Object&nbsp;o,Method&nbsp;method,Object[]&nbsp;args,</span></p>
                        <p><span style="color: #000000">        MethodProxy&nbsp;proxy)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Throwable<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span style="color: #000000">"</span><span style="color: #000000">调用日志方法</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">method.getName());<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result</span><span style="color: #000000">=</span><span style="color: #000000">proxy.invoke(dao,&nbsp;args);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        }</span></p>
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            </span>可见，原来模式里在getDao()时由enhancer创建dao，而&nbsp;调用intercept时则将enhancer创建的dao以Object o参数传回。<br />
            而新模式里，dao在getDao()时从外面传入，enhancer.create()返回的是一个proxy. 而调用intercept时，实际会用之前传入的dao进行操作，而忽略Object o参数传入的proxy。</p>
            <p>有点遗憾, intercept函数里MethodProxy的Signature是固定的，即客户如果调用foo(String),你不可以用proxy.invoke偷换成foo(String,String); </p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/fuhoujun/aggbug/233074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-08 10:38 <a href="http://www.blogjava.net/fuhoujun/archive/2008/10/08/233074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>