<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title></title>
    <description></description>
    <link>http://bleakoasis.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>工欲善其事,必先利其器</title>
        <author>bleakoasis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bleakoasis.javaeye.com">bleakoasis</a>&nbsp;
          链接：<a href="http://bleakoasis.javaeye.com/blog/183457" style="color:red;">http://bleakoasis.javaeye.com/blog/183457</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="color: #ff0000;"><span style="color: #000000; font-family: Times New Roman;">几个比较实用的eclipse插件</span></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="color: #ff0000;"><span style="font-family: Times New Roman;">colorer </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">改变</span><span lang="EN-US"><span style="font-family: Times New Roman;">jsp</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">字体颜色（有</span><span lang="EN-US"><span style="font-family: Times New Roman;">MyEclipse</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">插件就不用考虑了，没用</span><span lang="EN-US"><span style="font-family: Times New Roman;">MyEclipse</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的强烈推荐）</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="color: #ff0000;"><span style="font-family: Times New Roman;">easyexplore </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">快速打开指定文件的文件夹</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="color: #ff0000;"><span style="color: #ff0000;">Merve Tomcat Launcher Plugin</span> </span><span lang="EN-US">tomcat</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">插件（如果项目是</span><span lang="EN-US"><span style="font-family: Times New Roman;">tomcat</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">工程得话用此插件吧）</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="color: #ff0000;"><span style="font-family: Times New Roman;">jseclipse </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">可以编辑</span><span lang="EN-US"><span style="font-family: Times New Roman;">JavaScript </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">文件，支持语法突出显示和包括了一些常用的面向对象的方法。支持的面向对象的功能有：构造函数，类方法，实例方法，类变量等等。支持代码错误提示，警靠报告等。</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="color: #ff0000;">eclipsetidy </span><span lang="EN-US">EclipseTidy</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">基于</span><span lang="EN-US"><a href="http://eclipsetidy.sourceforge.net/#tidy-intro"><span style="color: windowtext; text-decoration: none; text-underline: none;"><span style="font-family: Times New Roman;">HTML Tidy</span></span></a></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">提供校验和格式化</span><span lang="EN-US"><span style="font-family: Times New Roman;">HTML/XML</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">文件的功能（用起来不太舒服，感觉不太实用）</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="color: #ff0000;"><span lang="EN-US">Call Hierarchy</span></span><span lang="EN-US"> </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">显示一个方法的调用层次（</span><span lang="EN-US"><span style="font-family: Times New Roman;">eclipse</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">有自带的功能，不过如果装上此插件会有个快捷方式小图标）</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;"><span style="color: #ff0000;">Fat Jar&nbsp;</span><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">打包工具</span></span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://bleakoasis.javaeye.com/blog/183457#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Apr 2008 17:08:51 +0800</pubDate>
        <link>http://bleakoasis.javaeye.com/blog/183457</link>
        <guid>http://bleakoasis.javaeye.com/blog/183457</guid>
      </item>
      <item>
        <title>一个关于Spring AOP很有意思的问题。</title>
        <author>bleakoasis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bleakoasis.javaeye.com">bleakoasis</a>&nbsp;
          链接：<a href="http://bleakoasis.javaeye.com/blog/182654" style="color:red;">http://bleakoasis.javaeye.com/blog/182654</a>&nbsp;
          发表时间: 2008年04月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java"><br />public class UserDAOImpl{
<br /><br />	public void save() {
<br />		// TODO Auto-generated method stub
<br />		System.out.println("user saved");
<br />	}
<br />}
<br />//相关配置，省略了一些不相关内容
<br />&lt;bean id="userDAO" class="UserDAOImpl"&gt;
<br />&lt;bean id="userDAOProxy"  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt; 
<br />    &lt;property name="target"&gt; 
<br />        &lt;ref local="userDAO" /&gt; 
<br />    &lt;/property&gt; 
<br />&lt;/bean&gt;</pre>
<p>&nbsp;&nbsp; 测试代码</p>
<pre name="code" class="java">		ApplicationContext ctx =
<br />			new FileSystemXmlApplicationContext("applicationContext.xml");
<br />		UserDAOImpl userDAOImpl = 
<br />			(UserDAOImpl)ctx.getBean("userDAOProxy");
<br />		userDAOImpl.save();</pre>
<p>&nbsp;&nbsp; 上面这种情况下程序可以正常运行，但是如果UserDAOImpl实现了一个接口，其他不变</p>
<pre name="code" class="java">public class UserDAOImpl implements UserDAO {
<br />
<br />	public void save() {
<br />		// TODO Auto-generated method stub
<br />		System.out.println("user saved");
<br />	}
<br />
<br />}</pre>
<p>&nbsp;这种情况下，程序将不能正常运行，会抛出java.lang.ClassCastException异常</p>
<p>理解上面这种情况产生的原因需要了解Spring AOP的实现原理。<br />Spring 实现AOP是依赖JDK动态代理和CGLIB代理实现的。<br />以下是JDK动态代理和CGLIB代理简单介绍<br />&nbsp;&nbsp;&nbsp; JDK动态代理：其代理对象必须是某个接口的实现，它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。<br />&nbsp;&nbsp;&nbsp; CGLIB代理：实现原理类似于JDK动态代理，只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包，底层是依靠ASM（开源的java字节码编辑类库）操作字节码实现的，性能比JDK强。<br />Spring是依靠什么来判断采用哪种代理策略来生成AOP代理呢？以下代码就是Spring的判断逻辑</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">
<pre name="code" class="java">    //org.springframework.aop.framework.DefaultAopProxyFactory
<br />	//参数AdvisedSupport 是Spring AOP配置相关类
<br />	public AopProxy createAopProxy(AdvisedSupport advisedSupport)
<br />			throws AopConfigException {
<br />		//在此判断使用JDK动态代理还是CGLIB代理
<br />		if (advisedSupport.isOptimize() || advisedSupport.isProxyTargetClass()
<br />				|| hasNoUserSuppliedProxyInterfaces(advisedSupport)) {
<br />			if (!cglibAvailable) {
<br />				throw new AopConfigException(
<br />						"Cannot proxy target class because CGLIB2 is not available. "
<br />								+ "Add CGLIB to the class path or specify proxy interfaces.");
<br />			}
<br />			return CglibProxyFactory.createCglibProxy(advisedSupport);
<br />		} else {
<br />			return new JdkDynamicAopProxy(advisedSupport);
<br />		}
<br />	}</pre>
</div>
</div>
</div>
<p>&nbsp;</p>
<p><span style="font-size: small;">
<p><span style="font-size: x-small;"><span style="font-family: 仿宋;">
<p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; advisedSupport.isOptimize()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">与</span><span lang="EN-US">advisedSupport.isProxyTargetClass()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">默认返回都是</span><span lang="EN-US">false</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，所以在默认情况下目标对象有没有实现接口决定着</span><span lang="EN-US">Spring</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">采取的策略，当然可以设置</span><span lang="EN-US">advisedSupport.isOptimize()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">或者</span><span lang="EN-US">advisedSupport.isProxyTargetClass()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">返回为</span><span lang="EN-US">true</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，这样无论目标对象有没有实现接口</span><span lang="EN-US">Spring</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">都会选择使用</span><span lang="EN-US">CGLIB</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代理。所以在默认情况下，如果一个目标对象如果实现了接口</span><span lang="EN-US">Spring</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">则会选择</span><span lang="EN-US">JDK</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">动态代理策略动态的创建一个接口实现类（动态代理类）来代理目标对象，可以通俗的理解这个动态代理类是目标对象的另外一个版本，所以这两者之间在强制转换的时候会抛出</span><span lang="EN-US">j ava.lang.ClassCastException</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。而所以在默认情况下，如果目标对象没有实现任何接口，</span><span lang="EN-US">Spring</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">会选择</span><span lang="EN-US">CGLIB</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代理，</span> <span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">其生成的动态代理对象是目标类的子类。</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"></span>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">&nbsp;&nbsp;&nbsp;</span>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; 以上说的是默认情况下，也可以手动配置一些选项使</span><span lang="EN-US"><span style="font-family: Times New Roman;">Spring</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">采用</span><span lang="EN-US"><span style="font-family: Times New Roman;">CGLIB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代理。</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">org.springframework.transaction.interceptor.TransactionProxyFactoryBean</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">是</span><span lang="EN-US"><span style="font-family: Times New Roman;">org.springframework.aop.framework. ProxyConfig</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的子类，所以可以参照</span><span lang="EN-US"><span style="font-family: Times New Roman;">ProxyConfig</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">里的一些设置如下所示，将</span><span lang="EN-US"><span style="font-family: Times New Roman;">optimize</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span><span lang="EN-US"><span style="font-family: Times New Roman;">proxyTargetClass</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">任意一个设置为</span><span lang="EN-US"><span style="font-family: Times New Roman;">true</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">都可以强制</span><span lang="EN-US"><span style="font-family: Times New Roman;">Spring</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">采用</span><span lang="EN-US"><span style="font-family: Times New Roman;">CGLIB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代理。</span></span></p>
<pre name="code" class="java">//相关配置，省略了一些不相关内容
<br />&lt;bean id="userDAO" class="UserDAOImpl"&gt;
<br />&lt;bean id="userDAOProxy"  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt; 
<br />    &lt;property name="target"&gt; 
<br />        &lt;ref local="userDAO" /&gt; 
<br />    &lt;/property&gt; 
<br />    &lt;property name="optimize"&gt; 
<br />        &lt;value&gt;true&lt;/value&gt;
<br />    &lt;/property&gt;
<br />    &lt;property name="proxyTargetClass"&gt; 
<br />        &lt;value&gt;true&lt;/value&gt;
<br />    &lt;/property&gt; 
<br />&lt;/bean&gt;</pre>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-size: small;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">CGLIB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代理也就不会出现前面提到的</span><span style="text-decoration: underline;"><span lang="EN-US" style="font-size: 10pt; color: navy; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">ClassCastException</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">问题了，</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">也可以在性能上有所提高，但是也有它的弊端，</span><span lang="EN-US"><span style="font-family: Times New Roman;">Spring doc</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">原文解释如下</span><span lang="EN-US"><span style="font-family: Times New Roman;">optimization will usually mean that advice changes won't <span style="mso-spacerun: yes;">&nbsp;</span>take effect after a proxy has been created. For this reason, optimization <span style="mso-spacerun: yes;">&nbsp;</span>is disabled by default</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。</span></p>
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</font></span></span>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</span></p>
<font face="Times New Roman">
<p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</p>
</font></span></span></p>
</p>
</span><font size="3"><font size="2">
<p>&nbsp;</p>
</font></font></span></p>
<font size="3">
<p>&nbsp;</p>
</font></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://bleakoasis.javaeye.com/blog/182654#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Apr 2008 17:34:02 +0800</pubDate>
        <link>http://bleakoasis.javaeye.com/blog/182654</link>
        <guid>http://bleakoasis.javaeye.com/blog/182654</guid>
      </item>
  </channel>
</rss>