﻿<?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-musiclover-随笔分类-Spring FrameWork</title><link>http://www.blogjava.net/musiclover/category/41030.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 17 Sep 2009 20:23:24 GMT</lastBuildDate><pubDate>Thu, 17 Sep 2009 20:23:24 GMT</pubDate><ttl>60</ttl><item><title>Spring AOP 学习笔记</title><link>http://www.blogjava.net/musiclover/archive/2009/08/23/292311.html</link><dc:creator>Jxi</dc:creator><author>Jxi</author><pubDate>Sun, 23 Aug 2009 14:52:00 GMT</pubDate><guid>http://www.blogjava.net/musiclover/archive/2009/08/23/292311.html</guid><wfw:comment>http://www.blogjava.net/musiclover/comments/292311.html</wfw:comment><comments>http://www.blogjava.net/musiclover/archive/2009/08/23/292311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/musiclover/comments/commentRss/292311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/musiclover/services/trackbacks/292311.html</trackback:ping><description><![CDATA[<span style="font-family: Tahoma"><span style="font-size: 12pt"><span style="font-family: Tahoma">AOP&nbsp; Aspect Oriented Programing&nbsp; 面向方面编程<br />
AOP 术语<br />
连接点:(Joinpoint)&nbsp;&nbsp;&nbsp; 程序执行的特定位置(类开始初始化前、类初始化后、调用前后、异常抛出后)<br />
切点:&nbsp;&nbsp;&nbsp;(PointCut)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序类中客观存在的事物（类中的方法）<br />
增强&nbsp;:&nbsp;&nbsp;(Advice)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;置入到目标类Joinpint的一段代码<br />
目标对象:(Target)&nbsp;&nbsp; 引介(Introduction)&nbsp; 织入(Weaving)&nbsp; 代理(Proxy) 切面(Aspect):切点和增强的组成&nbsp;<br />
&nbsp;<br />
基础知识: Spring Aop :使用动态代理技术在运行期间织入增强代码<br />
</span></span>ProxyFactory 代理工厂采用JDK代理或CGLib代理技术<br />
<strong style="font-size: 14pt">JDK 动态代理:</strong><br />
1.定义UserService接口函数:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_29_61_Open_Image" onclick="this.style.display='none'; Codehighlighter1_29_61_Open_Text.style.display='none'; Codehighlighter1_29_61_Closed_Image.style.display='inline'; Codehighlighter1_29_61_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_29_61_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_29_61_Closed_Text.style.display='none'; Codehighlighter1_29_61_Open_Image.style.display='inline'; Codehighlighter1_29_61_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;UserService&nbsp;</span><span id="Codehighlighter1_29_61_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addUser(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
2.UserServiceImpl<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_51_124_Open_Image" onclick="this.style.display='none'; Codehighlighter1_51_124_Open_Text.style.display='none'; Codehighlighter1_51_124_Closed_Image.style.display='inline'; Codehighlighter1_51_124_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_51_124_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_51_124_Closed_Text.style.display='none'; Codehighlighter1_51_124_Open_Image.style.display='inline'; Codehighlighter1_51_124_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;UserServiceImpl&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;UserService</span><span id="Codehighlighter1_51_124_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_81_122_Open_Image" onclick="this.style.display='none'; Codehighlighter1_81_122_Open_Text.style.display='none'; Codehighlighter1_81_122_Closed_Image.style.display='inline'; Codehighlighter1_81_122_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_81_122_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_81_122_Closed_Text.style.display='none'; Codehighlighter1_81_122_Open_Image.style.display='inline'; Codehighlighter1_81_122_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&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;addUser(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id)</span><span id="Codehighlighter1_81_122_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">添加一个用户中&nbsp;：</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">id);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
3.ProxyHandler<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.InvocationHandler;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.Method;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_133_447_Open_Image" onclick="this.style.display='none'; Codehighlighter1_133_447_Open_Text.style.display='none'; Codehighlighter1_133_447_Closed_Image.style.display='inline'; Codehighlighter1_133_447_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_133_447_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_133_447_Closed_Text.style.display='none'; Codehighlighter1_133_447_Open_Image.style.display='inline'; Codehighlighter1_133_447_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ProxyHandler&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;InvocationHandler</span><span id="Codehighlighter1_133_447_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Object&nbsp;target;<br />
<img id="Codehighlighter1_199_228_Open_Image" onclick="this.style.display='none'; Codehighlighter1_199_228_Open_Text.style.display='none'; Codehighlighter1_199_228_Closed_Image.style.display='inline'; Codehighlighter1_199_228_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_199_228_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_199_228_Closed_Text.style.display='none'; Codehighlighter1_199_228_Open_Image.style.display='inline'; Codehighlighter1_199_228_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;ProxyHandler(Object&nbsp;target)</span><span id="Codehighlighter1_199_228_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.target</span><span style="color: #000000">=</span><span style="color: #000000">target;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></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 />
<img id="Codehighlighter1_318_445_Open_Image" onclick="this.style.display='none'; Codehighlighter1_318_445_Open_Text.style.display='none'; Codehighlighter1_318_445_Closed_Image.style.display='inline'; Codehighlighter1_318_445_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_318_445_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_318_445_Closed_Text.style.display='none'; Codehighlighter1_318_445_Open_Image.style.display='inline'; Codehighlighter1_318_445_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Throwable&nbsp;</span><span id="Codehighlighter1_318_445_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">添加用户前</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;obj</span><span style="color: #000000">=</span><span style="color: #000000">method.invoke(target,args);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">添加用户后</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;obj;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
TestProxyHandler<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.Proxy;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_63_374_Open_Image" onclick="this.style.display='none'; Codehighlighter1_63_374_Open_Text.style.display='none'; Codehighlighter1_63_374_Closed_Image.style.display='inline'; Codehighlighter1_63_374_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_63_374_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_63_374_Closed_Text.style.display='none'; Codehighlighter1_63_374_Open_Image.style.display='inline'; Codehighlighter1_63_374_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ProxyHandlerTest&nbsp;</span><span id="Codehighlighter1_63_374_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_105_372_Open_Image" onclick="this.style.display='none'; Codehighlighter1_105_372_Open_Text.style.display='none'; Codehighlighter1_105_372_Closed_Image.style.display='inline'; Codehighlighter1_105_372_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_105_372_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_105_372_Closed_Text.style.display='none'; Codehighlighter1_105_372_Open_Image.style.display='inline'; Codehighlighter1_105_372_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&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[])</span><span id="Codehighlighter1_105_372_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserService&nbsp;target</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;UserServiceImpl();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProxyHandler&nbsp;handler</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ProxyHandler(target);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserService&nbsp;proxy</span><span style="color: #000000">=</span><span style="color: #000000">(UserService)Proxy.newProxyInstance(<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target.getClass().getClassLoader(),<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target.getClass().getInterfaces(),<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy.addUser(</span><span style="color: #000000">100</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<strong style="font-size: 12pt">CGLib 代理:</strong><br />
AddUserService接口:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">package&nbsp;CGlib.Text.Service;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;AddUserService&nbsp;{<br />
&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;addUser(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id);<br />
}<br />
</span></div>
<br />
AddUserServiceImpl 实现类:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;CGlib.Text.Service;<br />
<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;AddUserServiceImpl&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;AddUserService&nbsp;{<br />
<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;addUser(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">添加用户ID中:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
CglibProxy 代理类:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;CGlib.Text.Service;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.Method;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;net.sf.cglib.proxy.Enhancer;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;net.sf.cglib.proxy.MethodInterceptor;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;net.sf.cglib.proxy.MethodProxy;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_238_911_Open_Image" onclick="this.style.display='none'; Codehighlighter1_238_911_Open_Text.style.display='none'; Codehighlighter1_238_911_Closed_Image.style.display='inline'; Codehighlighter1_238_911_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_238_911_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_238_911_Closed_Text.style.display='none'; Codehighlighter1_238_911_Open_Image.style.display='inline'; Codehighlighter1_238_911_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CglibProxy&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;MethodInterceptor</span><span id="Codehighlighter1_238_911_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings(</span><span style="color: #000000">"</span><span style="color: #000000">unchecked</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_351_447_Open_Image" onclick="this.style.display='none'; Codehighlighter1_351_447_Open_Text.style.display='none'; Codehighlighter1_351_447_Closed_Image.style.display='inline'; Codehighlighter1_351_447_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_351_447_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_351_447_Closed_Text.style.display='none'; Codehighlighter1_351_447_Open_Image.style.display='inline'; Codehighlighter1_351_447_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;getProxy(Class&nbsp;clazz)</span><span id="Codehighlighter1_351_447_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setSuperclass(clazz);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setCallback(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;enhancer.create();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;intercept(Object&nbsp;obj,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args,<br />
<img id="Codehighlighter1_556_906_Open_Image" onclick="this.style.display='none'; Codehighlighter1_556_906_Open_Text.style.display='none'; Codehighlighter1_556_906_Closed_Image.style.display='inline'; Codehighlighter1_556_906_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_556_906_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_556_906_Closed_Text.style.display='none'; Codehighlighter1_556_906_Open_Image.style.display='inline'; Codehighlighter1_556_906_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&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;</span><span id="Codehighlighter1_556_906_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">添加用户之前</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(method.getName());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(obj.getClass().getName()</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">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(args.getClass().getName());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result</span><span style="color: #000000">=</span><span style="color: #000000">proxy.invokeSuper(obj,&nbsp;args);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</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">args.toString());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">添加用户之后</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
CglibProxyTest:测试类<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;CGlib.Text.Service;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_57_271_Open_Image" onclick="this.style.display='none'; Codehighlighter1_57_271_Open_Text.style.display='none'; Codehighlighter1_57_271_Closed_Image.style.display='inline'; Codehighlighter1_57_271_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_57_271_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_57_271_Closed_Text.style.display='none'; Codehighlighter1_57_271_Open_Image.style.display='inline'; Codehighlighter1_57_271_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CglibProxyTest&nbsp;</span><span id="Codehighlighter1_57_271_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_98_268_Open_Image" onclick="this.style.display='none'; Codehighlighter1_98_268_Open_Text.style.display='none'; Codehighlighter1_98_268_Closed_Image.style.display='inline'; Codehighlighter1_98_268_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_98_268_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_98_268_Closed_Text.style.display='none'; Codehighlighter1_98_268_Open_Image.style.display='inline'; Codehighlighter1_98_268_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&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)</span><span id="Codehighlighter1_98_268_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CglibProxy&nbsp;proxy</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CglibProxy();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddUserServiceImpl&nbsp;userService</span><span style="color: #000000">=</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(AddUserServiceImpl)proxy.getProxy(AddUserServiceImpl.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userService.addUser(</span><span style="color: #000000">100</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
<strong>对JDK动态代理和Cglib动态代理的理解：<br />
</strong>JDK&nbsp;&nbsp; 代理时性能高，但生成代理对象时运行性能较低<br />
Cglib 代理时性能低，但生成代理对象时运行性能较高<br />
所以：单例Singleton 时采用CGLib代理。<br />
<br />
</span>
<img src ="http://www.blogjava.net/musiclover/aggbug/292311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/musiclover/" target="_blank">Jxi</a> 2009-08-23 22:52 <a href="http://www.blogjava.net/musiclover/archive/2009/08/23/292311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring </title><link>http://www.blogjava.net/musiclover/archive/2009/07/25/288336.html</link><dc:creator>Jxi</dc:creator><author>Jxi</author><pubDate>Sat, 25 Jul 2009 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/musiclover/archive/2009/07/25/288336.html</guid><wfw:comment>http://www.blogjava.net/musiclover/comments/288336.html</wfw:comment><comments>http://www.blogjava.net/musiclover/archive/2009/07/25/288336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/musiclover/comments/commentRss/288336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/musiclover/services/trackbacks/288336.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-align: left" align="left"><strong><span style="font-size: 18pt; font-family: 宋体">Spring</span></strong></p>
<table cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm" valign="top"></td>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; width: 60pt; padding-top: 0cm" valign="top" width="80">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Important&nbsp;</span></p>
            </td>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Spring is an <em>application framework</em>. Unlike single-tier frameworks such as Struts or Hibernate, Spring aims to help structure whole applications in a consistent, productive manner, pulling together best-of-breed single-tier frameworks to create a coherent architecture.</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; font-family: 宋体">Problems with the Traditional Approach to J2EE</span></strong></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; font-family: 宋体">传统J2EE方法存在的问题</span></strong></p>
<ul type="disc">
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">J2EE applications tend to contain excessive amounts of "plumbing" code.</span></strong><span style="font-size: 12pt; font-family: 宋体">多</span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">Many J2EE applications use a distributed object model where this is inappropriate.</span></strong><strong><span style="font-size: 12pt; font-family: 宋体">杂</span></strong></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">The EJB component model is unduly complex.</span></strong><span style="font-size: 12pt; font-family: 宋体">不当</span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">EJB is overused.</span></strong><span style="font-size: 12pt; font-family: 宋体">过度使用</span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">Many "J2EE design patterns" are not, in fact, design patterns, but workarounds for technology limitations.</span></strong><span style="font-size: 12pt; font-family: 宋体">技术跟不上</span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">J2EE applications are hard to unit test.</span></strong><span style="font-size: 12pt; font-family: 宋体">测试难</span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">Certain J2EE technologies have simply failed.</span></strong></li>
</ul>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; font-family: 宋体">Enter Spring</span></strong></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; font-family: 宋体">接触Spring</span></strong></p>
<ul type="disc">
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><em><span style="font-size: 12pt; font-family: 宋体">Inversion of Control </span></em></strong><strong><span style="font-size: 12pt; font-family: 宋体">container:</span></strong><span style="font-size: 12pt; font-family: 宋体">倒置控制</span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">Aspect-Oriented Programming (AOP) framework:</span></strong></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">Data access abstraction:</span></strong></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">JDBC simplification:</span></strong></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">Transaction management:</span></strong></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">MVC web framework:</span></strong></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">Simplification for working with JNDI, JTA, and other J2EE APIs:</span></strong></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">Lightweight remoting:</span></strong></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">JMS support:</span></strong></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">JMX support:</span></strong></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">Support for a comprehensive testing strategy for application developers:</span></strong></li>
</ul>
<p>The key Spring values can be summarized as follows:</p>
<p style="margin-left: 36pt; text-indent: -18pt; tab-stops: list 36.0pt"><span style="font-size: 10pt; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Spring is a non-invasive framework.</strong>非侵入 </p>
<p style="margin-left: 36pt; text-indent: -18pt; tab-stops: list 36.0pt"><span style="font-size: 10pt; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Spring provides a consistent programming model, usable in any environment. </strong></p>
<p style="margin-left: 36pt; text-indent: -18pt; tab-stops: list 36.0pt"><span style="font-size: 10pt; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Spring aims to promote code reuse.</strong>复用</p>
<p style="margin-left: 36pt; text-indent: -18pt; tab-stops: list 36.0pt"><span style="font-size: 10pt; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Spring aims to facilitate Object Oriented design in J2EE applications.</strong></p>
<p style="margin-left: 36pt; text-indent: -18pt; tab-stops: list 36.0pt"><span style="font-size: 10pt; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Spring aims to facilitate good programming practice, such as programming to interfaces, rather than classes.面向</strong>接口</p>
<p style="margin-left: 36pt; text-indent: -18pt; tab-stops: list 36.0pt"><span style="font-size: 10pt; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Spring promotes pluggability.</strong>性能</p>
<p style="margin-left: 36pt; text-indent: -18pt; tab-stops: list 36.0pt"><span style="font-size: 10pt; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Spring facilitates the extraction of configuration values from Java code into XML or properties files. </strong></p>
<p style="margin-left: 36pt; text-indent: -18pt; tab-stops: list 36.0pt"><span style="font-size: 10pt; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Spring is designed so that applications using it are as easy as possible to test.</strong></p>
<p style="margin-left: 36pt; text-indent: -18pt; tab-stops: list 36.0pt"><span style="font-size: 10pt; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Spring is consistent.</strong></p>
<p style="margin-left: 36pt; text-indent: -18pt; tab-stops: list 36.0pt"><span style="font-size: 10pt; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Spring promotes architectural choice. </strong></p>
<p style="margin-left: 36pt; text-indent: -18pt; tab-stops: list 36.0pt"><span style="font-size: 10pt; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Spring does not reinvent the wheel.</strong></p>
 <img src ="http://www.blogjava.net/musiclover/aggbug/288336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/musiclover/" target="_blank">Jxi</a> 2009-07-25 14:57 <a href="http://www.blogjava.net/musiclover/archive/2009/07/25/288336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>