﻿<?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天空 任我翱翔-随笔分类-Spring</title><link>http://www.blogjava.net/persister/category/15657.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 16 Sep 2010 02:40:44 GMT</lastBuildDate><pubDate>Thu, 16 Sep 2010 02:40:44 GMT</pubDate><ttl>60</ttl><item><title>Spring IOC和AOP的原理浅析</title><link>http://www.blogjava.net/persister/archive/2006/12/29/90657.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Fri, 29 Dec 2006 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2006/12/29/90657.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/90657.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2006/12/29/90657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/90657.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/90657.html</trackback:ping><description><![CDATA[<strong>一、Spring IOC</strong><br />
为使用Spring IoC容器，应用代码可以通过下面两个接口完成：<br />
<p>
1.BeanFactory。当应用创建BeanFactory实例时，实际上是完成了JavaBean的<strong>实例化、配置以及管理</strong>。</p>
<p>&nbsp;Resource resource = new ClassPathResource("appcontext.xml");<br />
&nbsp;BeanFactory factory = new XmlBeanFactory(resource);<br />
&nbsp;HelloWord hw = (HelloWorld)factory.getBean("fileHelloWorld");<br />
&nbsp; <br />
&nbsp;appcontext.xml的部分内容如下示例：
</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">beans</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">hello</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com.taiji.HelloWorld</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">hello</span><span style="color: #000000;">'</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">I&nbsp;love&nbsp;you</span><span style="color: #000000;">!&lt;/</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">person</span><span style="color: #000000;">'</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ref&nbsp;bean</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">person</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">person</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">name</span><span style="color: #000000;">'</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">Liu</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">age</span><span style="color: #000000;">'</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">25</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">beans</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<p>&nbsp; <br />
2.ApplicationContext。继承于BeanFactory，主要用于J2EE开发，也是Spring推荐使用的接口。对于Web应用而
言,当J2EE Web应用部署并启动时，Spring
ApplicationContext将会自动被实例化。通过ContextLoaderServlet和ContextLoaderListener能
够自动创建ApplicationContext实例，开发者也可以手动创建。对于struts，采用PlugIn的方式加载是一个非常好的方式。见前面
的<a href="../../persister/archive/2006/09/25/71767.html">struts和spring的整合方案。</a></p>
<p>那么Spring是怎么做到IOC的呢？Java的反射即可实现IOC机制，通过反射可以生成对象实例，并且通过调用其set方法设置对象的属性：</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Object&nbsp;newInstance(String&nbsp;className)&nbsp;{<br />
&nbsp;&nbsp;Class</span><span style="color: #000000;">&lt;?&gt;</span><span style="color: #000000;">&nbsp;cls&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;Object&nbsp;obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;cls&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Class.forName(className);<br />
&nbsp;&nbsp;&nbsp;obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cls.newInstance();<br />
&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(ClassNotFoundException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(e);<br />
&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(InstantiationException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(e);<br />
&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IllegalAccessException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(e);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;obj;<br />
&nbsp;}<br />
<br />
</span></div>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setProperty(Object&nbsp;obj,&nbsp;String&nbsp;name,&nbsp;String&nbsp;value)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class</span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;Object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;clazz&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj.getClass();&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;methodName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;returnSetMthodName(name);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method[]&nbsp;ms&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;clazz.getMethods();&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(Method&nbsp;m&nbsp;:&nbsp;ms)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(m.getName().equals(methodName))&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(m.getParameterTypes().length&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class</span><span style="color: #000000;">&lt;?&gt;</span><span style="color: #000000;">&nbsp;clazzParameterType&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;m.getParameterTypes()[</span><span style="color: #000000;">0</span><span style="color: #000000;">];&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setFieldValue(clazzParameterType.getName(),&nbsp;value,&nbsp;m,&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(SecurityException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(e);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(e);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IllegalAccessException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(e);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(InvocationTargetException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(e);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
</span></div>
<p>&nbsp;</p>
<p>IOC不难吧，你也可以做一个IOC框架哦？<br />
</p>
<p><strong>二、Spring AOP</strong></p>
<p>Spring的AOP要复杂一些，不是仅仅搞个反射就能解决的。AOP最简单的实现机制就是JAVA的动态代理。</p>
<p>动态代理在调用真正的业务类方法之前或之后都插入了代码，这就是JDK的动态代理做的事情，如下是一个动态代理的例子：</p>
<p>
</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;Action&nbsp;{<br />
<br />
</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;method();<br />
<br />
}<br />
<br />
</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ActionImpl&nbsp;&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Action<br />
{<br />
</span><span style="color: #0000ff;">&nbsp;&nbsp; public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;mothod()&nbsp;{<br />
<br />
&nbsp;&nbsp; System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Action!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
&nbsp;}<br />
}<br />
</span></div>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MyInvocationHandler&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;InvocationHandler&nbsp;{<br />
<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Object&nbsp;obj;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;MyInvocationHandler(Object&nbsp;obj)&nbsp;{<br />
<br />
</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj;<br />
<br />
}<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;invoke(Object&nbsp;proxy,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args)<br />
<br />
</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Throwable&nbsp;{<br />
<br />
System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Before&nbsp;Action</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
Object&nbsp;returnObject&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;method.invoke(obj,&nbsp;args);<br />
<br />
System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">After&nbsp;Action.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;returnObject;<br />
</span></div>
<p><br />
</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;InterruptedException,<br />
<br />
IllegalArgumentException,&nbsp;SecurityException,<br />
<br />
InstantiationException,&nbsp;IllegalAccessException,<br />
<br />
InvocationTargetException,&nbsp;NoSuchMethodException&nbsp;{<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">实现业务逻辑的类</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
ActionImpl a </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ActionImpl();<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">JDK创建的动态逻辑类,调用上面的构造函数注入</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
MyInvocationHandler&nbsp;myInvocation&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MyInvocationHandler(a);<br />
</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">建业务逻辑类的动态代理类</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
Object&nbsp;proxy&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Proxy.newProxyInstance(ActionImpl.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader(), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionImpl.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getInterfaces(),&nbsp;myInvocation);<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">业务类自己调用运行代理对象</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
Action action </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Action)&nbsp;proxy;<br />
<br />
&nbsp;&nbsp;&nbsp; action.</span><span style="color: #000000;">method();</span><span style="color: #000000;"><br />
<br />
}<br />
<br />
}</span></div>
<p>运行后会打印出：</p>
<p>Before Action.</p>
<p>Action!</p>
<p>After Action.</p>
<p>Java的动态代理有一个缺陷，它代理的类必须有一个接口类，否则就不能实现动态代理。在面向接口的编程里面，也许不会有问题，但是事情总是有特殊，那如何实现呢？在Spring中是通过<a href="http://cglib.sourceforge.net/">CGLIB</a>来实现的。CGLIB可以直接对类进行增强。如下代码对一个类进行增强：</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MyClass&nbsp;{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;method()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">MyClass.method()</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.reflect.Method;<br />
&nbsp;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;net.sf.cglib.proxy.Enhancer;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;net.sf.cglib.proxy.MethodProxy;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;net.sf.cglib.proxy.MethodInterceptor;<br />
&nbsp;<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Main&nbsp;{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enhancer&nbsp;enhancer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Enhancer();<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setSuperclass(MyClass.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setCallback(&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MethodInterceptorImpl()&nbsp;);<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;my&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(MyClass)enhancer.create();<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my.method();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #000000;"><br />
}<br />
<br />
</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MethodInterceptorImpl&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;MethodInterceptor&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;intercept(Object&nbsp;obj,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;args,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodProxy&nbsp;proxy)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Throwable&nbsp;{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(method);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy.invokeSuper(obj,&nbsp;args);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span>&nbsp;<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span><br />
<span style="color: #000000;"><br />
</span></div>
<p><span style="color: #000000;"><br />
</span></p>
<p><span style="color: #000000;">执行结果：<br />
</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;"> MyClass.method()<br />
MyClass.method()</span></p>
<p>可以看到通过CGLIB实现类方法的增加并不比动态代理复杂。当然Spring中需要考虑的东西更多，具体可以研究org.springframework.aop.framework.Cglib2AopProxy.java，实现起来更复杂。这里只是浅析，有助于理解吧。</p>
<p><br />
</p>
<img src ="http://www.blogjava.net/persister/aggbug/90657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2006-12-29 10:16 <a href="http://www.blogjava.net/persister/archive/2006/12/29/90657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts和Spring整合方案</title><link>http://www.blogjava.net/persister/archive/2006/09/25/71767.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Mon, 25 Sep 2006 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2006/09/25/71767.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/71767.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2006/09/25/71767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/71767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/71767.html</trackback:ping><description><![CDATA[今天项目经理告诉我，这次项目是采用Struts + Spring的架构方式，让我了解一下它们的整合方式和原理。项目中一直是采用struts，还没有使用到Spring。不过自己对Spring作为IOC的容器有一定的了解，当然是通过夏昕的&#8220;Spring开发指南&#8221;。如何通过这两者进行整合呢，整合的优势又在哪里呢，于是上ibm网站<a href="http://www.ibm.com/developerworks/cn/" class="bctl">developerWorks 中国</a>搜索了一下，有一篇文章非常不错，推荐一下：<a href="http://www.ibm.com/developerworks/cn/java/j-sr2.html">使用 Spring 更好地处理 Struts 动作。</a><br />
文章介绍了三种整合的方案，方案一和方案二都是对struts控制器的扩展，即Action和RequestProcessor。而方案三采用动作代理，对struts完全没有任何的侵入，是非常理想的整合方案。<br />
<img src ="http://www.blogjava.net/persister/aggbug/71767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2006-09-25 15:50 <a href="http://www.blogjava.net/persister/archive/2006/09/25/71767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>