1. 程式人生 > 其它 >05-Spring的AOP程式設計之基於註解開發

05-Spring的AOP程式設計之基於註解開發

Spring的AOP基於註解的開發

  • 首先在AOP配置檔案中,開啟註解的aop開發
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
  • 寫註解增強類 需要加上註解@Aspect
@Component
@Aspect  /*表示告訴spring當前類是切面類*/
public class MyAspect2 {

    @Before("execution(* com.yd.service.impl.UserServiceImpl.add(..))")
    public void check(){
        System.out.println("----之前校驗身份");
    }

    @AfterReturning("execution(* com.yd.service.impl.UserServiceImpl.delete(..))")
    public void back(){
        System.out.println("----之後增強");
    }

    /**
     * 接收原方法返回值的後置增強方法
     * @param obj 切入點的返回值
     */
    @AfterReturning(value = "execution(* com.yd.service.impl.UserServiceImpl.deleteReturn(..))",returning = "obj")
    public void backReturn(Object obj){
        System.out.println("後置接收切入點返回值:"+obj);
    }

    /**
     * 環繞增強
     * @param point 連線點
     * @throws Throwable
     */
    @Around(value = "execution(* com.yd.service.impl.UserServiceImpl.deleteAround(..))")
    public void around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("----之前增強");
        //執行切入點的方法
        point.proceed();
        System.out.println("----之後增強");
    }

    /**
     * 環繞增強,接收切入點的傳入的引數
     * @param point
     * @throws Throwable
     */
    @Around("execution(* com.yd.service.impl.UserServiceImpl.update(..))")
    public void aroundParam(ProceedingJoinPoint point)throws Throwable{
        System.out.println("---之前增強");
        //獲取切入點的引數
        Object[] args = point.getArgs();
        point.proceed();
        System.out.println("---之後增強 切入點引數1:"+args[0]+" 引數2:"+args[1]);
    }
    /**
     * 環繞增強,接收切入點的傳入的引數,切接收返回
     * @param point
     * @throws Throwable
     */
    @Around("execution(* com.yd.service.impl.UserServiceImpl.updateReturn(..))")
    public void aroundReturn(ProceedingJoinPoint point)throws Throwable{
        System.out.println("---之前增強");
        //獲取切入點的引數
        Object[] args = point.getArgs();
        String str = (String)point.proceed();
        System.out.println("---之後增強 切入點引數1:"+args[0]+" 引數2:"+args[1]+" 返回值:"+str);
    }

    /**
     * 切入點有異常
     * @param e 異常
     */
    @AfterThrowing(value = "execution(* com.yd.service.impl.UserServiceImpl.selectException(..))",throwing = "e")
    public void afterCatch(Exception e){
        System.out.println(e.getMessage());
        System.out.println("---捕獲異常");
    }

    //@After("execution(* com.yd.service.impl.UserServiceImpl.selectException(..))")
    @After("execution(* com.yd.service.impl.UserServiceImpl.selectFin(..))")
    public void finallyDo(){
        System.out.println("finally,總會執行...");
    }

}
  • 用註解時,@After與@AfterThrowing同時增強同一個異常方法時,先執行@After,再執行@AfterThrowing

    • 與xml增強最後文件中的方式二結果一致
  • 補充:強制使用Cglib的動態代理,在開啟aop註解下,加上

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here -->
    <!--開啟aop註解-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <!--強制使用Cglib的動態代理-->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>