﻿<?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</title><link>http://www.blogjava.net/killme2008/category/19789.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 11:26:01 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 11:26:01 GMT</pubDate><ttl>60</ttl><item><title>数据结构学习系列</title><link>http://www.blogjava.net/killme2008/articles/98296.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 06 Feb 2007 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/articles/98296.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/98296.html</wfw:comment><comments>http://www.blogjava.net/killme2008/articles/98296.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/98296.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/98296.html</trackback:ping><description><![CDATA[
		<a href="http://dennnis-zane.blog.sohu.com/action/m_list-ebi_dd242a4792-c_1924716/entry/">http://dennnis-zane.blog.sohu.com/action/m_list-ebi_dd242a4792-c_1924716/entry/</a>
		<br />
		<br />都懒的贴了。。。有兴趣的看看<img src ="http://www.blogjava.net/killme2008/aggbug/98296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-06 14:18 <a href="http://www.blogjava.net/killme2008/articles/98296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PL/SQL学习笔记系列</title><link>http://www.blogjava.net/killme2008/articles/98295.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 06 Feb 2007 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/articles/98295.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/98295.html</wfw:comment><comments>http://www.blogjava.net/killme2008/articles/98295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/98295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/98295.html</trackback:ping><description><![CDATA[
		<a href="http://dennnis-zane.blog.sohu.com/action/m_list-ebi_dd242a4792-c_1193031/entry/">http://dennnis-zane.blog.sohu.com/action/m_list-ebi_dd242a4792-c_1193031/entry/</a>
<img src ="http://www.blogjava.net/killme2008/aggbug/98295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-06 14:17 <a href="http://www.blogjava.net/killme2008/articles/98295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB3系列学习笔记</title><link>http://www.blogjava.net/killme2008/articles/98254.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 06 Feb 2007 04:52:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/articles/98254.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/98254.html</wfw:comment><comments>http://www.blogjava.net/killme2008/articles/98254.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/98254.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/98254.html</trackback:ping><description><![CDATA[懒的一篇一篇转了，贴链接，有兴趣的看看<br /><br />开发环境设置：<a href="http://dennnis-zane.blog.sohu.com/11396668.html">http://dennnis-zane.blog.sohu.com/11396668.html</a><br /><br />学习笔记：<br /><a href="http://dennnis-zane.blog.sohu.com/11396254.html">http://dennnis-zane.blog.sohu.com/11396254.html</a><br /><a href="http://dennnis-zane.blog.sohu.com/11529148.html">http://dennnis-zane.blog.sohu.com/11529148.html</a><br /><a href="http://dennnis-zane.blog.sohu.com/11613918.html">http://dennnis-zane.blog.sohu.com/11613918.html</a><br /><a href="http://dennnis-zane.blog.sohu.com/11622554.html">http://dennnis-zane.blog.sohu.com/11622554.html</a><br /><a href="http://dennnis-zane.blog.sohu.com/11891739.html">http://dennnis-zane.blog.sohu.com/11891739.html</a><br /><a href="http://dennnis-zane.blog.sohu.com/11960400.html">http://dennnis-zane.blog.sohu.com/11960400.html</a><br /><a href="http://dennnis-zane.blog.sohu.com/12210434.html">http://dennnis-zane.blog.sohu.com/12210434.html</a><br /><a href="http://dennnis-zane.blog.sohu.com/12519970.html">http://dennnis-zane.blog.sohu.com/12519970.html</a><br /><a href="http://dennnis-zane.blog.sohu.com/12522828.html">http://dennnis-zane.blog.sohu.com/12522828.html</a><br /><a href="http://dennnis-zane.blog.sohu.com/12653691.html">http://dennnis-zane.blog.sohu.com/12653691.html</a><img src ="http://www.blogjava.net/killme2008/aggbug/98254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-06 12:52 <a href="http://www.blogjava.net/killme2008/articles/98254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个spring框架的AOP例子</title><link>http://www.blogjava.net/killme2008/articles/98253.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 06 Feb 2007 04:49:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/articles/98253.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/98253.html</wfw:comment><comments>http://www.blogjava.net/killme2008/articles/98253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/98253.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/98253.html</trackback:ping><description><![CDATA[
		<p>接触spring有一段时间了，不过都是看的多，写的少，工作忙，公司也不准备用。自己写过一些小东西用到，也只用到了BeanFactory组装对象，JdbcTemplate代替jdbc，事务管理。。。东抓一把，西抓一把，没形成系统。最近也在看spring自带的reference，一时手痒，写了个AOP的创建advice的例子，比之单纯地使用TransationProxyFactoryBean对AOP的理解又深入了点，打算看看它的源代码，基于CGLIB的实现对类的代理不了解，倒是好奇它如何实现对接口的代理——也就是利用J2SE的动态代理技术。</p>
		<p>例子如下：讲述一间书店开始打折促销，规则是每一名顾客只能买一本书，而且&lt;spring in action&gt;已经脱销了。。。。。你可以去掉TestAdvice里的注释看看各种运行结果，具体就不解释咯，在代码注释里。</p>
		<p>首先，你必须对增强(advice)有所了解，增强就是在特定连接点执行的动作。advice contains the logic of your aspect。增强，分为4类：</p>
		<ol>
				<li>
						<strong>前增强</strong>(before) 在连接点之前调用 </li>
				<li>
						<strong>后增强</strong>(after) 在连接点执行之后调用、 </li>
				<li>
						<strong>环绕增强</strong>(around) 完整控制整个方法流程，必须调用MethodInvocation的proceed促使真实操作发生 </li>
				<li>
						<strong>异常增强</strong> 针对某个异常抛出时调用 </li>
		</ol>
		<p>
				<strong>书店，一个buyBook业务：</strong>
		</p>
		<p>package com.denny_blue.springdemo.aop;</p>
		<p>public interface BuyBook {<br />       public void buyBook(String customer,String book)throws NoThisBookException;<br />}</p>
		<p>
				<strong>实现此接口的一个业务对象，如果顾客要买&lt;spring in action&gt;就抛出NoThisBookException异常。</strong>
		</p>
		<p>package com.denny_blue.springdemo.aop;</p>
		<p>public class MyBuyBook implements BuyBook {<br /> public void buyBook(String customer,String book)throws NoThisBookException{<br />  if(book.equals("&lt;spring in action&gt;"))<br />   throw new NoThisBookException("对不起，没有"+book+"存货了！");<br />  System.out.println(customer+",你好，你已经购买了一本"+book+"!");<br /> }<br />}<br /></p>
		<p>
				<strong>自定义两个异常类，其中NoThisBookException被抛出时将触发MyThrowsAdvice调用：</strong>
		</p>
		<p>//NoThisBookException.java</p>
		<p>package com.denny_blue.springdemo.aop;</p>
		<p>
				<br />public class NoThisBookException extends RuntimeException {<br /> public NoThisBookException(String msg){<br />  super(msg);<br /> }</p>
		<p>}</p>
		<p>//BuyBookException</p>
		<p>package com.denny_blue.springdemo.aop;</p>
		<p>public class BuyBookException extends RuntimeException {<br /> public BuyBookException(String msg){<br />  super(msg);<br />  System.out.println(msg);<br /> }</p>
		<p>}</p>
		<p>
				<strong>OK，接下来就是各类增强了，前增强，在业务方法buyBook之前调用，显示欢迎信息：</strong>
		</p>
		<p>package com.denny_blue.springdemo.aop;</p>
		<p>import java.lang.reflect.Method;</p>
		<p>import org.springframework.aop.MethodBeforeAdvice;</p>
		<p>public class MyBeforeAdvice implements MethodBeforeAdvice {</p>
		<p>
				<br /> public void before(Method arg0, Object[] arg1, Object target)<br />   throws Throwable {<br />  String customer=(String)arg1[0];      //第2个参数组就是被增强的方法传入的参数，本例中即customer,book<br />  System.out.println("欢迎光临!"+customer+"!");   //显示欢迎信息！，在buyBook方法前调用</p>
		<p> }</p>
		<p>}</p>
		<p> </p>
		<p>
				<strong>然后是后增强，当顾客已经买了书之后，显示欢送信息：</strong>
		</p>
		<p>package com.denny_blue.springdemo.aop;</p>
		<p>import java.lang.reflect.Method;</p>
		<p>import org.springframework.aop.AfterReturningAdvice;</p>
		<p>public class MyAfterAdvice implements AfterReturningAdvice {</p>
		<p> public void afterReturning(Object arg0, Method arg1, Object[] arg2,<br />   Object arg3) throws Throwable {<br />   String customer=(String)arg2[0];      //同前增强一样，参数组3为传入参数，具体见spring doc<br />  System.out.println("欢迎下次再来！"+customer+"!");   //显示欢送信息!<br /> }</p>
		<p>}</p>
		<p>
				<strong>OK，有了上面两个advice我们就能提供给顾客很好的服务态度了，等等？我们还有规则没实现，不是说一名顾客只能买一本书吗？OK，我们用环绕增强来解决，在环绕增强中保存一个HashSet，判断顾客是否来过，来过就抛出一个异常，没来过再放入此Set中：</strong>
		</p>
		<p>package com.denny_blue.springdemo.aop;</p>
		<p>import java.util.HashSet;<br />import java.util.Set;</p>
		<p>import org.aopalliance.intercept.MethodInterceptor;<br />import org.aopalliance.intercept.MethodInvocation;</p>
		<p>public class MyAroundAdvice implements MethodInterceptor {</p>
		<p> private Set customers=new HashSet();    //保存购过书的顾客信息<br /> public Object invoke(MethodInvocation invocation) throws Throwable {<br />        String customer=(String)invocation.getArguments()[0];<br />        if(customers.contains(customer)){<br />         throw new BuyBookException("对不起，一名顾客只能买一本打折书！");<br />        }<br />        Object result=invocation.proceed();   //调用MyBuyBook中的buyBook方法，即<strong>真实操作</strong><br />        customers.add(customer);<br />        return result;<br /> }</p>
		<p>}</p>
		<p>
				<strong>好了，最后一个，异常增强，当顾客要买&lt;spring in action&gt;时，我们的书店没书了，请仓库部门赶快订货！！</strong>
		</p>
		<p>package com.denny_blue.springdemo.aop;</p>
		<p>import org.springframework.aop.ThrowsAdvice;</p>
		<p>public class MyThrowsAdvice implements ThrowsAdvice {<br />    public void afterThrowing(NoThisBookException e){    //可以定义多个方法，只要传入的参数是不同异常<br />     System.out.print("通知仓库，赶紧加订书！");<br />    }</p>
		<p>}<br /></p>
		<p>好了没？还没，我们需要一个XML文件来组装这些对象，来代理业务接口，完整的beans.xml如下，各元素的含义请自己查看spring reference</p>
		<p>?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;</p>
		<p>&lt;beans&gt;<br />     &lt;bean id="myBuyBookTarget" class="com.denny_blue.springdemo.aop.MyBuyBook"/&gt;<br />     &lt;bean id="myBeforeAdvice" class="com.denny_blue.springdemo.aop.MyBeforeAdvice"/&gt;<br />     &lt;bean id="myAroundAdvice" class="com.denny_blue.springdemo.aop.MyAroundAdvice"/&gt;<br />     &lt;bean id="myAfterAdvice" class="com.denny_blue.springdemo.aop.MyAfterAdvice"/&gt;<br />     &lt;bean id="myThrowsAdvice" class="com.denny_blue.springdemo.aop.MyThrowsAdvice"/&gt;<br />     &lt;bean id="buyBook" class="org.springframework.aop.framework.ProxyFactoryBean"&gt;<br />        &lt;property name="proxyInterfaces"&gt;<br />            &lt;value&gt;com.denny_blue.springdemo.aop.BuyBook&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="interceptorNames"&gt;<br />            &lt;list&gt;<br />                  &lt;value&gt;myBeforeAdvice&lt;/value&gt;<br />                  &lt;value&gt;myAfterAdvice&lt;/value&gt;<br />                  &lt;value&gt;myAroundAdvice&lt;/value&gt;<br />                  &lt;value&gt;myThrowsAdvice&lt;/value&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />        &lt;property name="target"&gt;<br />            &lt;ref bean="myBuyBookTarget"/&gt;<br />        &lt;/property&gt;<br />     &lt;/bean&gt;<br />&lt;/beans&gt;</p>
		<p>我们先声明所有的bean，通过</p>
		<p> &lt;bean id="myBuyBookTarget" class="com.denny_blue.springdemo.aop.MyBuyBook"/&gt;<br />确定将要被增强的对象——目标对象(target)，我们可以很容易地替换这个目标对象，只要它实现业务接口。代理的接口通过:</p>
		<p>&lt;property name="proxyInterfaces"&gt;<br />            &lt;value&gt;com.denny_blue.springdemo.aop.BuyBook&lt;/value&gt;<br />&lt;/property&gt;<br />设定，然后是要用到一系列增强，注意，顺序是很有影响的！你可以尝试着改变顺序看看结果：）</p>
		<p>&lt;property name="interceptorNames"&gt;<br />            &lt;list&gt;<br />                  &lt;value&gt;myBeforeAdvice&lt;/value&gt;<br />                  &lt;value&gt;myAfterAdvice&lt;/value&gt;<br />                  &lt;value&gt;myAroundAdvice&lt;/value&gt;<br />                  &lt;value&gt;myThrowsAdvice&lt;/value&gt;<br />            &lt;/list&gt;<br />&lt;/property&gt;<br /></p>
		<p>
				<strong>一切准备好了，我们来测试吧，GO GO GO</strong>
		</p>
		<p>package test;</p>
		<p>import org.springframework.context.ApplicationContext;<br />import org.springframework.context.support.FileSystemXmlApplicationContext;</p>
		<p>import com.denny_blue.springdemo.aop.BuyBook;</p>
		<p>public class TestAdvice {<br /> public static void main(String args[]){<br />  ApplicationContext ctx=new FileSystemXmlApplicationContext("/src/beans.xml");  </p>
		<p>  //我的beans.xml放在项目下的src目录，eclipse环境下，请自己调整<br />  BuyBook buybook=(BuyBook)ctx.getBean("buyBook");<br />  buybook.buyBook("jordan","&lt;深入浅出hibernate&gt;");<br />  // buybook.buyBook("dennis","&lt;spring in action&gt;");    //去掉注释即可观察异常增强<br /> // buybook.buyBook("jordan","&lt;深入浅出hibernate&gt;");   //去掉注释即可观察环绕增强</p>
		<p> }<br />}</p>
		<p> </p>
		<p>一个简单的例子，脱胎于spring reference，希望对您帮助：）</p>
<img src ="http://www.blogjava.net/killme2008/aggbug/98253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-06 12:49 <a href="http://www.blogjava.net/killme2008/articles/98253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 《深入浅出hibernate》系列读书笔记</title><link>http://www.blogjava.net/killme2008/articles/98251.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 06 Feb 2007 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/articles/98251.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/98251.html</wfw:comment><comments>http://www.blogjava.net/killme2008/articles/98251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/98251.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/98251.html</trackback:ping><description><![CDATA[
		<p>1.http://blog.csdn.net/killme2008/archive/2006/04/30/699257.aspx</p>
		<p>2.http://blog.csdn.net/killme2008/archive/2006/05/02/705613.aspx</p>
		<p>3.http://blog.csdn.net/killme2008/archive/2006/05/04/707633.aspx</p>
		<p>4.http://blog.csdn.net/killme2008/archive/2006/05/05/709199.aspx</p>
<img src ="http://www.blogjava.net/killme2008/aggbug/98251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-06 12:48 <a href="http://www.blogjava.net/killme2008/articles/98251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Java Puzzlers系列读书笔记</title><link>http://www.blogjava.net/killme2008/articles/98252.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 06 Feb 2007 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/articles/98252.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/98252.html</wfw:comment><comments>http://www.blogjava.net/killme2008/articles/98252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/98252.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/98252.html</trackback:ping><description><![CDATA[
		<p>1.http://blog.csdn.net/killme2008/archive/2006/05/01/704537.aspx</p>
		<p>2.http://blog.csdn.net/killme2008/archive/2006/05/01/704572.aspx</p>
		<p>3.http://blog.csdn.net/killme2008/archive/2006/05/05/708983.aspx</p>
		<p>4.http://blog.csdn.net/killme2008/archive/2006/05/13/726869.aspx</p>
		<p>5.http://blog.csdn.net/killme2008/archive/2006/05/14/728172.aspx</p>
		<p>6.http://blog.csdn.net/killme2008/archive/2006/05/14/728486.aspx</p>
<img src ="http://www.blogjava.net/killme2008/aggbug/98252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-06 12:48 <a href="http://www.blogjava.net/killme2008/articles/98252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>