![]() |
|
package com.denny_blue.springdemo.aop;
import java.util.HashSet;
import java.util.Set;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyAroundAdvice implements MethodInterceptor {
private Set customers=new HashSet(); //保存购过书的顾客信息
public Object invoke(MethodInvocation invocation) throws Throwable {
String customer=(String)invocation.getArguments()[0];
if(customers.contains(customer)){
throw new BuyBookException("对不起,一名顾客只能买一本打折书!");
}
Object result=invocation.proceed(); //调用MyBuyBook中的buyBook方法,即真实操作
customers.add(customer);
return result;
}
}
好了,最后一个,异常增强,当顾客要买时,我们的书店没书了,请仓库部门赶快订货!!
package com.denny_blue.springdemo.aop;
import org.springframework.aop.ThrowsAdvice;
public class MyThrowsAdvice implements ThrowsAdvice {
public void afterThrowing(NoThisBookException e){ //可以定义多个方法,只要传入的参数是不同异常
System.out.print("通知仓库,赶紧加订书!");
}
}
好了没?还没,我们需要一个XML文件来组装这些对象,来代理业务接口,完整的beans.xml如下,各元素的含义请自己查看spring reference
?xml version="1.0" encoding="UTF-8"?>
com.denny_blue.springdemo.aop.BuyBook
myBeforeAdvice
myAfterAdvice
myAroundAdvice
myThrowsAdvice
我们先声明所有的bean,通过
确定将要被增强的对象??目标对象(target),我们可以很容易地替换这个目标对象,只要它实现业务接口。代理的接口通过:
com.denny_blue.springdemo.aop.BuyBook
设定,然后是要用到一系列增强,注意,顺序是很有影响的!你可以尝试着改变顺序看看结果:)
myBeforeAdvice
myAfterAdvice
myAroundAdvice
myThrowsAdvice
一切准备好了,我们来测试吧,GO GO GO
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.denny_blue.springdemo.aop.BuyBook;
public class TestAdvice {
public static void main(String args[]){
ApplicationContext ctx=new FileSystemXmlApplicationContext("/src/beans.xml");
//我的beans.xml放在项目下的src目录,eclipse环境下,请自己调整
BuyBook buybook=(BuyBook)ctx.getBean("buyBook");
buybook.buyBook("jordan","<深入浅出hibernate>");
// buybook.buyBook("dennis",""); //去掉注释即可观察异常增强
// buybook.buyBook("jordan","<深入浅出hibernate>"); //去掉注释即可观察环绕增强
}
}
[1] [2]