﻿<?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-PhoenixLi-文章分类-Framework</title><link>http://www.blogjava.net/lihao336/category/41325.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 20 Aug 2009 20:46:48 GMT</lastBuildDate><pubDate>Thu, 20 Aug 2009 20:46:48 GMT</pubDate><ttl>60</ttl><item><title>JVM，反射与动态代理(转)</title><link>http://www.blogjava.net/lihao336/articles/291966.html</link><dc:creator>PhoenixLi</dc:creator><author>PhoenixLi</author><pubDate>Thu, 20 Aug 2009 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/articles/291966.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/291966.html</wfw:comment><comments>http://www.blogjava.net/lihao336/articles/291966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/291966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/291966.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java 程序的工作机制： Java 对象都以单独的 class 文件存在， java 虚拟机将其载入并执行其虚拟机指令。 &nbsp; Java 虚拟机查找这些 java 对象： java 虚拟机根据 class path 来查找 java 对象，而虚拟机的 class path 又分为三层： bootstrap ： sun.boot.class.path extension...&nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/articles/291966.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/291966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">PhoenixLi</a> 2009-08-20 16:00 <a href="http://www.blogjava.net/lihao336/articles/291966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK动态代理</title><link>http://www.blogjava.net/lihao336/articles/291930.html</link><dc:creator>PhoenixLi</dc:creator><author>PhoenixLi</author><pubDate>Thu, 20 Aug 2009 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/articles/291930.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/291930.html</wfw:comment><comments>http://www.blogjava.net/lihao336/articles/291930.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/291930.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/291930.html</trackback:ping><description><![CDATA[<p>动态代理的特点是，不要静态的写Proxy类，而是在运行时由jdk自己帮助生成类，然后注入到classloader中去。</p>
<p>代码：<br />
public interface BusinessProcess{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void processBusiness();<br />
}</p>
<p>public class BusinessProcessImpl implements BusinessProcess{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void processBusiness(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("in businessProcessImpl");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>如果要对BusinessProcessImpl增加权限验证功能，那么静态代理代码：<br />
public class BusinessProcessProxy implements BusinessProcess{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private BusinessProcess target;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public BusinessProcessProxy(BusinessProcess target){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.target = target;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void processBusiness(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checkPermission();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.target.processBusiness();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>对于动态代理:<br />
public class PermissionHandler implements InvocationHandler {<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Object target;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public LoggerHandler(Object target){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.target = target;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checkPermission();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object result = method.invoke(this.target,args);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>测试代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BusinessProcessImpl impl = new BusinessProcessImpl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PermissionHandler handler = new PermissionHandler (impl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BusinessProcess proxy = (BusinessProcess)Proxy.newProxyInstance(impl.getClass().getClassLoader(),impl.getClass().getInterfaces(), handler);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy.processBusiness();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy对象是BusinessProcess接口的一个实现类，但是不是BusinessProcessImpl的子类</p>
<p><br />
看起来好像静态代理和动态代理没什么区别，但是仔细一看，静态代理代理的target只能是BusinessProcess对象，而动态代理却能够代理任何一个Object对象，这就是关键区别。所以程序中不需要为每个核心类写一个Proxy，而公用一个就可以。</p>
<p>动态代理的实现原理：<br />
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces);<br />
proxyClass = defineClass0(loader, proxyName,proxyClassFile, 0,proxyClassFile.length);<br />
这是java.lang.reflect.Proxy的两行关键代码，第一行代码生成名为proxyName, 实现的接口为interfaces的一个类的字节码。<br />
第二行代码，将生成的字节码注入到classloader中去。</p>
<p>第一次为某个object生成proxyClass可能比较耗费性能，但是Proxy方法作了缓存，可以弥补这一点。此外，动态代理只能够对interfaces进行动态的代理, 也就是说它先找出需要代理的对象实现的所有的interface, 然后只对所有的这些interface的所有的方法代理，对象除了interfaces以外的方法不予处理。</p>
<img src ="http://www.blogjava.net/lihao336/aggbug/291930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">PhoenixLi</a> 2009-08-20 12:57 <a href="http://www.blogjava.net/lihao336/articles/291930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IoC与DI (转载)</title><link>http://www.blogjava.net/lihao336/articles/291619.html</link><dc:creator>PhoenixLi</dc:creator><author>PhoenixLi</author><pubDate>Tue, 18 Aug 2009 04:12:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/articles/291619.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/291619.html</wfw:comment><comments>http://www.blogjava.net/lihao336/articles/291619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/291619.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/291619.html</trackback:ping><description><![CDATA[<p><span style="font-family: 微软雅黑">&nbsp;</span><span style="font-family: 微软雅黑">（本文转自http://www.cnblogs.com/zhuweisky/archive/2006/01/19/320220.html）</span></p>
<p><span style="font-family: 微软雅黑">一个朋友发了封mail问了几个问题，其中的一个是关于IoC和DI的：<br />
Inversion of Control和Dependency Injection 是什么关系，我认为两个词代表的是同一个意思，只是两种不同的表示，对吗？</span></p>
<p><span style="font-family: 微软雅黑">下面是我对这个问题的一些理解。<br />
准确的说，IoC和DI并不相同，这一点从字面上就可以看出，否则，它们可以叫一个名字。^_^</span></p>
<p><span style="font-family: 微软雅黑">理解IoC，我们需要知道Control是什么，它又是怎样被Inversion的。其实，IoC是用来说明&#8220;程序库&#8221;和&#8220;框架&#8221;区别的最好证据。在使用程序库的时候，控制权是掌握在我们手中的，我们编写的代码调用程序库的实现，完成相应的功能，想想我们使用JDK的情况。使用框架的时候，控制权则掌握在框架手中，<em><strong>我们的代码最终是由框架调用</strong></em>，一个常见的例子是Servlet，我们编写的Servlet代码是放在整个Servlet的框架中，由Web容器进行调用。这就是差异所在。我们更习惯于自己掌控一切，因此，对框架掌握控制权的这种情况，我们用&#8220;Inversion&#8221;来形容，这也是Martin Fowler在那篇给DI正名的文章中提到，所有框架都是IoC的原因。</span></p>
<p><span style="font-family: 微软雅黑">Spring的核心容器是一个框架，所以，我们可以说它是IoC，但是就如前面所说，每个框架都有IoC，所以，仅仅用IoC是不足以说明一切的。<strong><span style="background-color: yellow"><span style="font-family: 微软雅黑"><strong>Spring核心容器完成的是组件组装的过程，这是它和其它普通框架区别最为显著的地方。如果说用IoC描述这个框架，那么，这里所指的Control实际上是组件的组装过程。<br />
<br />
</strong></span></span></strong></span><span style="font-family: 微软雅黑">站在Spring核心容器的层面上看，它完成组装过程是把组件所依赖的零部件给组件安装上去。站在单个组件层面上看，它所需要的零部件是由外部给它安装的，这个过程就像是把&#8220;Dependency&#8221;这管药水用注射器&#8220;Injection&#8221;到组件的身体中去，所以，我们称之为&#8220;Dependency Injection&#8221;。</span></p>
<p><span style="font-family: 微软雅黑">完成组件组装的容器也不只是注入一种形式，还有一种常见的方式是&#8220;<strong>Dependency Lookup</strong>&#8221;，即每个组件自己去查找自己所需要的内容。至于到哪去找，也有不同的实现方式，有固定到某个地方（比如使用静态方法），有把查找点通过DI的方式注入进来等等。</span></p>
<p><span style="font-family: 微软雅黑">Martin Fowler的文章已经很清楚的解释了IoC和DI这两个概念，我们只需要去细细品味。</span></p>
<img src ="http://www.blogjava.net/lihao336/aggbug/291619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">PhoenixLi</a> 2009-08-18 12:12 <a href="http://www.blogjava.net/lihao336/articles/291619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>