独自幸福快乐孕妇能吃炸鸡柳吗依依不舍孤独

电热设备2020年06月18日

接触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>查看本文来源

平顶山治疗白斑的医院
希爱力效果怎么样
六盘水什么医院治疗白癜风
相关阅读
应采儿带儿子出游,老大外表帅气招风耳惹眼,小儿子清秀似女孩

在在,应采儿在社交平台上社交了一张自己和两个孩子的截图,配文是:“这...

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
友情链接