最近领导安排了一个AOP(主要是spring下的)培训的任务,就个人来说,不要说aop了,连spring都是一件让人头疼的事情,不过通过一周的突击学习下来,spring并不是想象中的那么难,倒是蛮有趣,学习aop更是开阔了很多编程方面的思路,由于是给同事培训AOP,结合了网上一些有意思的例子YY了一个AOP图书馆的建设,具体实现在
附件中,至于lib的jar主要是junit和spring-2.5.6,这个没有在附件中含有,希望对看到这篇blog的人有所帮助!
情景介绍:
在图书馆里,读者(Reader)能借书(borrow)
第一个需求:
需要记录读者借书的开始/结束时间
需求带来的问题:
读者不愿意自己记录开始结束时间
解决办法:
增加一个管理员(ReaderProxy),由他来记录
情景介绍:
在图书馆里,管理员忙碌于记录读者借书的开始/结束时间
第二个需求:
读者要还书了,也要记录还书的开始/结束时间
需求带来的问题:
需要培训管理员如何记录还书(ReaderProxy类增加giveBack方法)时间
解决办法:
管理员(DynaReaderProxy)记录读者动作的时间,不关心动作内容
情景介绍:
在图书馆里,管理员忙碌于记录读者借书/还书的开始/结束时间
第三个需求:
不需要记录动作的开始时间了
需求带来的问题:
管理员抱怨:今天不记录开始时间了,明天又要记录怎么办?
解决办法:
增加一台智能感应器(IOperation),管理员(DynaReaderProxy)只需要把书在感应器上面扫一下就行了,那天记录什么,感应器里的程序说了算
情景介绍:
在图书馆里,管理员忙碌于把书放在感应器上
第四个需求:
管理员精力都浪费在这种琐事上面,他打算把这个AOP业务外包
问题:
找那家AOP公司外包呢?
解决办法:
鼎鼎大名的Spring公司承接了这个工程
情景介绍:
在图书馆里,Spring公司的职员忙碌于把书放在感应器上
第五个需求:
每位读者突然发现拿错了一本书(BorrowWrongBookExcepiton),需要中断这本书的操作过程
解决办法:
ThrowsAdvice,抛出接错书的异常
情景介绍:
在图书馆里,Spring公司的职员忙碌于把书放在感应器上
第六个需求:
每位读者最多借2本书
存在问题:
读者记不住自己借了几本书,如果借到第三本的时候,图书馆告诉他不能借了(BorrowMaxBookExcepiton),他就希望图书馆告诉他现在借了什么
解决办法:
MethodInterceptor ,由spring公司记录读者借了几本书,而BeforeAdvice中要判断如果已经超出2本,抛出异常
情景介绍:
在图书馆里,Spring公司的职员忙碌于把书放在感应器上
第7个需求:
读者要划分档次,VIP读者(VipReader)能借最多3本书(borrowBook),还能借最多2张光盘(borrowVCD),不记录借书动作的结束时间了,但是要记录借VCD的结束时间
带来问题
需要在advice里面写入判断
解决办法:
PointCut/ClassMatcher/MethodMatcher 增加为特定的业务类写入方法,进一步解耦
情景介绍:
在图书馆里,Spring公司的职员忙碌于把书放在感应器上
第8个需求:
图书馆方面希望将业务类的XML配置和AOP相关配置分离
解决办法:
AutoProxy
文中提到了AspectJ也是个不错的选择,下次打算也用这个实现一把,呵呵