独自幸福快乐孕妇能吃炸鸡柳吗依依不舍孤独
接触spring有一段时间了,不过都是看的多,写的少,工作忙,公司也不准备用。自己写过一些小东西用到,也只用到了BeanFactory组装对象从根子上斩断或是限制其资金往来,JdbcTemplate代替jdbc,事务管理。。。东抓一把,西抓一把,没形成系统。最近也在看spring自带的reference,一时手痒,写了个AOP的创建advice的例子,比之单纯地使用TransationProxyFactoryBean对AOP的理解又深入了点,打算看看它的源代码,基于CGLIB的实现对类的代理不了解,倒是好奇它如何实现对接口的代理??也就是利用J2SE的动态代理技术。
例子如下:讲述一间书店开始打折促销,规则是每一名顾客只能买一本书,而且已经脱销了。。。。。你可以去掉TestAdvice里的注释看看各种运行结果,具体就不解释咯,在代码注释里。
首先,你必须对增强(advice)有所了解,增强就是在特定连接点执行的动作。advicecontainsthelogicofyouraspect。增强,分为4类:
前增强(before)在连接点之前调用
后增强(after)在连接点执行之后调用、
环绕增强(around)完整控制整个方法流程,必须调用MethodInvocation的proceed促使真实操作发生
异常增强针对某个异常抛出时调用
书店,一个buyBook业务:
nny_p;
publicinterfaceBuyBook{
publicvoidbuyBook(Stringcustomer,Stringbook)throwsNoThisBookException;
}
实现此接口的一个业务对象,如果顾客要买就抛出NoThisBookException异常。
nny_p;
publicclassMyBuyBookimplementsBuyBook{
publicvoidbuyBook(Stringcustomer,Stringbook)throwsNoThisBookException{
if(uals(""))
thrownewNoThisBookException("对不起,没有"+book+"存货了!");
intln(customer+",你好,你已经购买了一本"+book+"!");
}
}
自定义两个异常类,其中NoThisBookException被抛出时将触发MyThrowsAdvice调用:
//va
nny_p;
publicclassNoThisBookExceptionextendsRuntimeException{
publicNoThisBookException(Stringmsg){
super(msg);
}
}
//va
nny_p;
publicclassBuyBookExceptionextendsRuntimeException{
publicBuyBookException(Stringmsg){
super(msg);
intln(msg);
}
}
OK,接下来就是各类增强了,前增强,在业务方法buyBook之前调用,显示欢迎信息:
nny_p;
thod;
thodBeforeAdvice;
publicclassMyBeforeAdviceimplementsMethodBeforeAdvice{
publicvoidbefore(Methodarg0,Object[]arg1,Objecttarget)
throwsThrowable{
Stringcustomer=(String)arg1[0];//第2个参数组就是被增强的方法传入的参数,本例中即customer,book
intln("欢迎光临!"+customer+"!");//显示欢迎信息!,在buyBook方法前调用
}
}
然后是后增强,当顾客已经买了书之后,显示欢送信息:
nny_p;
thod;
terReturningAdvice;
publicclassMyAfterAdviceimplementsAfterReturningAdvice{
publicvoidafterReturning(Objectarg0,Methodarg1,Object[]arg2,
Objectarg3)throwsThrowable{
Stringcustomer=(String)arg2[0];//同前增强一样,参数组3为传入参数,具体见springdoc
intln("欢迎下次再来!"+customer+"去年11月!");//显示欢送信息!
}
}
OK,有了上面两个advice我们就能提供给顾客很好的服务态度了,等等?我们还有规则没实现,不是说一名顾客只能买一本书吗?OK,我们用环绕增强来解决,在环绕增强中保存一个HashSet,判断顾客是否来过,来过就抛出一个异常,没来过再放入此Set中:
nny_p;
shSet;
t;
thodInterceptor;
thodInvocation;
publicclassMyAroundAdviceimplementsMethodInterceptor{
privateSetcustomers=newHashSet();//保存购过书的顾客信息
publicObjectinvoke(MethodInvocationinvocation)throwsThrowable{
Stringcustomer=(String)tArguments()[0];
if(ntains(customer)){
thrownewBuyBookException("对不起,一名顾客只能买一本打折书!");
}
Objectresult=oceed();//调用MyBuyBook中的buyBook方法,即真实操作
d(customer);
returnresult;
}
}
好了,最后一个,异常增强,当顾客要买时,我们的书店没书了,请仓库部门赶快订货!!
nny_p;
rowsAdvice;
publicclassMyThrowsAdviceimplementsThrowsAdvice{
publicvoidafterThrowing(NoThisBookExceptione){//可以定义多个方法,只要传入的参数是不同异常
int("通知仓库,赶紧加订书!");
}
}
好了没?还没,我们需要一个XML文件来组装这些对象,来代理业务接口,完整的l如下,各元素的含义请自己查看springreference
?xmlversion="1.0"encoding="UTF-8"?
nny_yBook
myBeforeAdvice
myAfterAdvice
myAroundAdvice
myThrowsAdvice
我们先声明所有的bean,通过
确定将要被增强的对象??目标对象(target),我们可以很容易地替换这个目标对象,只要它实现业务接口。代理的接口通过:
nny_yBook
设定,然后是要用到一系列增强,注意,顺序是很有影响的!你可以尝试着改变顺序看看结果:)
myBeforeAdvice
myAfterAdvice
myAroundAdvice
myThrowsAdvice
一切准备好了,我们来测试吧,GOGOGO
packagetest;
plicationContext;
leSystemXmlApplicationContext;
nny_yBook;
publicclassTestAdvice{
publicstaticvoidmain(Stringargs[]){
ApplicationContextctx=newFileSystemXmlApplicationContext("/src/l");
//我的l放在项目下的src目录,eclipse环境下,请自己调整
BuyBookbuybook=(BuyBook)tBean("buyBook");
yBook("jordan","深入浅出hibernate");
//yBook("dennis","");//去掉注释即可观察异常增强
//yBook("jordan","深入浅出hibernate");//去掉注释即可观察环绕增强
}
}
href="http://java.ccidnet.com/art/3559//_1.html" target=_blank>查看本文来源
平顶山治疗白斑的医院希爱力效果怎么样六盘水什么医院治疗白癜风- 上一页:精氨酸布洛芬颗粒作用1
- 下一页:国家科技计划管理部际联席会议2018年第
-
应采儿带儿子出游,老大外表帅气招风耳惹眼,小儿子清秀似女孩
在在,应采儿在社交平台上社交了一张自己和两个孩子的截图,配文是:“这...
2023-11-24
-
育碧竞速新游戏特惠活动《极限国度》终极版239.2元
育碧竞速RPG特惠活动《临界值虚幻》终极版239.2元 《临界值虚幻》终极版包...
2023-11-03
-
“凭什么或多或少天生资质聪颖, 我生来就是被人欺辱的命,而他洛冰河一来就能师承高门” 沈九 沈清秋
“怎么会同样天生资质聪颖, 我但他却就是被人欺辱的大喜,而他洛冰山一...
2023-11-01
-
Mysteel日报:国内中厚板价格趋弱调整 成交不佳
一、商品总结从所需取向来看,由于中框价格比飙升小幅度相对于较小,当当...
2023-10-28
-
西部数据发布新款 SATA 蓝盘 SA510,1TB 价格约 671 元
IT之家 5 年底 22 日死讯,据 computerbase 死讯,西部数据发布了新款 WD Blue SA510...
2023-10-27
-
忽略了这一点,美白很难有功效!
盛夏来了,谁都想要一张洗涤透亮的暗讽啊! 本来漂白无非,做好清洁剂,...
2023-10-23