spring初学二(AOP)

DI实现松耦合,AOP实现可重用组件

日志模块、安全模块、事务模块都是单一的模块,只实现了自身功能,左边的各种服务要用到该模块时就要去调用,但是这些模块并不是左边服务的只要业务,却要不停的去调用,比较浪费时间。使用AOP组件化后如下

拿日志来举例子,日志覆盖到了他所影响到的所有的服务,各个服务可以不知道日志的存在。这样说有点说不清楚,举个例子来说吧

还是拿一篇中的骑士举例子,给每个骑士分配一个歌者(相当于日志模块),在骑士开始任务以前,唱歌歌颂(日志记录下),在骑士完成任务后,唱歌歌颂(日志记录下)。在没使用AOP之前,如图一所示,骑士服务代码如下:

public class KnightOfTheRoundTable implements Knight {
  private Minstrel minstrel;
  public void setMinstrel(Minstrel minstrel){
      this.minstrel=minstrel;
  }
  public Object embarkOnQuest() throws QuestFailedException {
      minstrel.singBefore(this);//任务前唱歌
      HolyGail grail=quest.embark();//执行任务
      minstrel.singAfter(this);//任务后唱歌
      return grail;
  }
}
诗人模块(日志模块代码如下)

public class Minstrel {
  private static final Logger SONG =
      Logger.getLogger(Minstrel.class);

  public Minstrel() {}
 
  public void singBefore(Knight knight) {
    SONG.info("Fa la la; Sir " + knight.getName() +
        " is so brave!");
  }
 
  public void singAfter(Knight knight) {
    SONG.info("Tee-hee-he; Sir " + knight.getName() +
        " did embark on a quest!");
  }
}
这里有个问题,骑士在探险开始前,必须停下来告诉歌者唱歌,探险结束后,骑士也必须要停下来告诉歌者唱歌。骑士除了负责自己的探险任务外,还得关心歌者歌颂,如果歌者比较懒,一直没法歌颂,那么骑士必须等待,这样就影响了骑士的探险任务。因此要像上面图二,将歌者实现称一个切面,覆盖骑士的功能,把歌者为骑士提示服务是理所应该的,骑士甚至可以不知道歌者的存在,切面的实现如下

<bean id="minstrel"
      class="com.springinaction.chapter01.knight.Minstrel"/>
<aop:config>
    <aop:aspect ref="minstrel">                                                                                 //创建切面,切面是歌者
      <aop:pointcut
          id="questPointcut"
          expression="execution(* *.embarkOnQuest(..)) and target(bean)" />     //创建切入点,切入点是embarkOnQuest(),执行该方法即可触发该切入点

      <aop:before
          method="singBefore"
          pointcut-ref="questPointcut"                                                                           //在切入点之前执行singBefore方法
          arg-names="bean" />

      <aop:after-returning
          method="singAfter"                                                                                            //在切入点之前执行singAfter方法
          pointcut-ref="questPointcut"
          arg-names="bean" />
    </aop:aspect>
  </aop:config>
spring配置文件中的aop切面实现了歌者如何歌颂,因此骑士可以不用关心歌者,甚至无需知道歌者的存在。骑士的代码如下

public class KnightOfTheRoundTable implements Knight {
  private Quest quest;
  public Object embarkOnQuest() throws QuestFailedException {
      HolyGail grail=quest.embark();//执行任务
      return grail;
  }
}
骑士根本不知道歌者的存在,当执行embarkOnQuest()方法时,就触发了切入点,就按照切面逻辑执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值