05-Spring的AOP程式設計之基於註解開發
阿新 • • 發佈:2021-06-21
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>