浅谈spring aop的五种通知类型

  

<强> spring aop通知(建议)分成五类:,
  

  

前置通知[之前建议]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常只

  

正常返回通知[回国后建议]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行只

  

异常返回通知[投掷后建议]:在连接点抛出异常后执行只

  

返回通知[(最后)后建议]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容只

  

环绕通知[Around通知]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。

  

环绕通知还需要负责决定是继续处理连接点(调用ProceedingJoinPoint的处理方法)还是中断执行只
  接下来通过编写示例程序来测试一下五种通知类型:

  

定义接口

        包com.chenqa.springaop.example.service;      公共接口BankService {/* *   *模拟的银行转账   从出* @param账人   * @param入账人   * @param帐户转账金额   * @return   */公共布尔转移(字符串形式、字符串、双账户);   }      

编写实现类

        包com.chenqa.springaop.example.service.impl;      进口com.chenqa.springaop.example.service.BankService;      公共类BCMBankServiceImpl实现BankService {      公共布尔转移(字符串形式、字符串、双账户){   如果(account<100) {   把新IllegalArgumentException(“最低转账金额不能低于100元”);   }   System.out.println(形式+”向“+ +”交行账户转账”+账户+ "元");   返回错误;   }      }      

修改弹簧配置文件,添加以下内容:

        & lt; !——bankService bean比;   & lt; bean id=癰ankService”类=癱om.chenqa.springaop.example.service.impl.BCMBankServiceImpl”/比;   & lt; !——切面——比;   & lt; bean id=癿yAspect”类=癱om.chenqa.springaop.example.aspect.MyAspect”/比;   & lt; !——aop配置——比;   & lt; aop: config>   ref=& lt; aop:方面“myAspect”比;   & lt; aop:切入点表达式="执行(* com.chenqa.springaop.example.service.impl。* . * (. .)) " id=扒腥氲恪?比;   & lt; aop:方法=爸啊敝皃ointcut-ref=扒腥氲恪?比;   方法后& lt; aop:="后" pointcut-ref=扒腥氲恪?比;   & lt; aop:回国后方法=" afterReturning " pointcut-ref=扒腥氲恪?比;   & lt; aop:投掷方法=" afterThrowing " pointcut-ref=扒腥氲恪?比;   & lt; aop:在方法="在" pointcut-ref=扒腥氲恪?比;   & lt;/aop: aspect>   & lt;/aop: config>      

编写测试程序

        ApplicationContext上下文=new ClassPathXmlApplicationContext (“spring-aop.xml”);   BankService BankService=上下文。getBean (“bankService BankService.class);   bankService。转移(“张三”、“李四”,200年),之前      

执行后输出:,
  

  

浅谈spring aop的五种通知类型”>,<br/>
  </p>
  <p>将测试程序中200年的改成50,再执行后输出:,<br/>
  </p>
  <p> <img src=   包装测试;      进口org.aspectj.lang.annotation.Pointcut;      公开课的切入点{   @Pointcut (value=" https://www.yisu.com/zixun/within(测试。*)”)   公共空间aopDemo () {      }   }      

<强>添加方面类

  

该类中的建议将会用到上面的切入点,使用方法请看各个建议的价值属性。

        包装测试;      进口org.aspectj.lang.JoinPoint;   进口org.aspectj.lang.ProceedingJoinPoint;   进口org.aspectj.lang.annotation。*;   进口org.springframework.stereotype.Component;      @ component   @Aspect   公开课Aspect1 {      @Before(值=" https://www.yisu.com/zixun/test.PointCuts.aopDemo ()”)   公共空间(连接点的连接点之前){   system . out。println (“[Aspect1]建议”);   }      @Around(值=" https://www.yisu.com/zixun/test.PointCuts.aopDemo ()”)   周围的公共空间(ProceedingJoinPoint pjp)抛出Throwable {   system . out。println (“[Aspect1]建议1 ");   pjp.proceed ();   system . out。println (“[Aspect1] advise2”);   }      @AfterReturning(值=" https://www.yisu.com/zixun/test.PointCuts.aopDemo ()”)   公共空afterReturning(连接点的连接点){   system . out。println (“Aspect1 afterReturning建议”);   }      @AfterThrowing(值=" https://www.yisu.com/zixun/test.PointCuts.aopDemo ()”)   公共空afterThrowing(连接点的连接点){   system . out。println (“Aspect1 afterThrowing建议”);   }      @After(值=" https://www.yisu.com/zixun/test.PointCuts.aopDemo ()”)   公共无效后(连接点的连接点){   system . out。println(“建议后[Aspect1]”);   }   }

浅谈spring aop的五种通知类型