黄晓童SPRING学习笔记:对AOP的初步理解
Spring的定义
对DI的初步理解
对AOP的初步理解
对DI的深入探究
对AOP的深入探究
Spring的事务管理
Spring MVC
接下来阐述一下我对AOP的理解,还是回到之前那个骑士和寻找圣杯的场景来。现在场景稍有改变,在骑士寻找圣杯的时候,要有一个诗人陪伴他,以朗诵诗歌的形式为他歌功颂德。按照以往的方式,最容易想到的一个方法就是:定义一个诗人的类,里面包含唱歌的方法,然后在骑士类里面有一个诗人类的实例,并在执行任务方法里调用诗人的唱歌方法。代码如下:
public class ShiRen{ public void singBefore() { System.out.println(“sing before”); } public void singAfter() { System.out.println(“sing after”); }}?
上面的是新定义的诗人类,下面我们将修改前面的骑士类:
Public class QiShi implement RenLei{ private RenWu renWu; public void setRenWu (RenWu renWu ) { this.renwu = renWu ; } private ShiRen shiRen; public void setShiRen (ShiRen shiRen ) { this. shiRen = shiRen; } public ShengBei zhiXingRenWu () { shiRen.singBefore(); ShengBei s = renWu. zhiXing (); shiRen.singAfter(); return s; }}?
?代码修改完毕,看上去没什么问题了。可是仔细一看就会发现这里面有个严重的问题:每次骑士寻找圣杯的时候,他都需要先停下来告诉诗人去朗诵诗歌,如果他忘记了去告诉诗人,诗人就不会去朗诵诗歌了。其实,诗人朗诵诗歌这件事骑士是不关心的。骑士要做的就是寻找圣杯,提醒诗人朗诵诗歌这件事已经超出了他的职责范围。
?通过上面的场景,我们已经发现了传统方法暴露出来的问题。这时我们就需要AOP技术的帮助。AOP用来帮助业务的分离,服务模块化,从而使这些组件更加专注于自身的业务。
下面我们在xml配置文件中追加如下代码段:
<bean id="shiRen" expression="execution(* *. zhiXingRenWu(..))" /> <aop:before method="singBefore" pointcut-ref="pointcut" /> <aop:after-returning method="singAfter" pointcut-ref="pointcut" /> </aop:aspect></aop:config>
?
然后,我们将骑士类再改回原来的样子就行了。在这里,我们将诗人声明为一个切面。至于配置文件里的具体细节后面会提到。