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" class="com.alibaba.ShiRen"/> <aop:config> <aop:aspect ref="shiRen"> <aop:pointcut id="pointcut" expression="execution(* *. zhiXingRenWu(..))" /> <aop:before method="singBefore" pointcut-ref="pointcut" /> <aop:after-returning method="singAfter" pointcut-ref="pointcut" /> </aop:aspect> </aop:config>
然后,我们将骑士类再改回原来的样子就行了。在这里,我们将诗人声明为一个切面。至于配置文件里的具体细节后面会提到。