1. 程式人生 > >【Spring學習筆記】11 spring aop 程式設計(註解方式)

【Spring學習筆記】11 spring aop 程式設計(註解方式)

2018.5.25註解方式比較繁瑣不直觀,瞭解即可1.建立web專案2.引入jar包在原來jar包基礎上引入aop相關的jar包

3.日誌檔案log4j.properties4.準備目標物件先建立介面再建立實現類
package com.lu.spring.aop.service;publicclassUserServiceImplimplementsUserService{@Overridepublicvoidsave(String name) {int a = 9/0; System.out.println("儲存使用者"); }@Overridepublicvoiddeltete() { System.out.println(
"刪除使用者"); }@Overridepublicvoidupdate() { System.out.println("更新使用者"); }@Overridepublicvoidselect() { System.out.println("查詢使用者"); }}
5.編寫通知
  • 前置通知:在目標方法之前呼叫
  • 後置通知(如果出現異常不呼叫):在目標方法之後呼叫的
  • 後置通知(無論異常都會呼叫):在目標方法之後呼叫的
  • 環繞通知:在目標方法之前後呼叫
  • 異常通知:出現異常在呼叫,不出現異常則不呼叫、
package com.lu.spring.aop.advice;import org.aspectj.lang.ProceedingJoinPoint;
/** * 通知 * @author bitware13 * */publicclassTransactionAdvice {/* 前置通知:在目標方法之前呼叫 後置通知(如果出現異常不呼叫):在目標方法之後呼叫的 後置通知(無論異常都會呼叫):在目標方法之後呼叫的 環繞通知:在目標方法之前後呼叫 異常通知:出現異常在呼叫,不出現異常則不呼叫*/publicvoidbefore() { System.out.println("前置通知被執行"); }publicvoidafter() { System.out.println("後置通知被執行,無論異常都會呼叫"); }publicvoidafterReturning
() { System.out.println("後置通知被執行,如果出現異常不呼叫"); }publicvoidafterException() { System.out.println("異常通知被執行"); }public Object around(ProceedingJoinPoint point) throws Throwable { System.out.println("環繞通知前"); Object proceed = point.proceed();//呼叫目標方法 System.out.println("環繞通知後");return proceed; }}
6.配置織入,將通知織入到目標物件expression="execution(* com.lu.spring.aop.service..*ServiceImpl.*(..))" 所有的返回值型別,service包下所有的子包中所有impl包下的所有有參無參的方法加入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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd" ><!-- 目標物件 --><bean name="userService"class="com.lu.spring.aop.service.UserServiceImpl"></bean><!-- 通知物件 --><bean name="transactionAdvice"class="com.lu.spring.aop.advice.TransactionAdvice"></bean><!-- 開啟織入註解 --><aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>
7.在通知上添加註解
package com.lu.spring.aop.advice;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;/** * 通知 * @author bitware13 * */@AspectpublicclassTransactionAdvice {/* 前置通知:在目標方法之前呼叫 後置通知(如果出現異常不呼叫):在目標方法之後呼叫的 後置通知(無論異常都會呼叫):在目標方法之後呼叫的 環繞通知:在目標方法之前後呼叫 異常通知:出現異常在呼叫,不出現異常則不呼叫*/@Pointcut("execution(* com.lu.spring.aop.service..*ServiceImpl.*(..))")public void pointcut() {}@Before("TransactionAdvice.pointcut()")public void before() { System.out.println("前置通知被執行"); }@After("execution(* com.lu.spring.aop.service..*ServiceImpl.*(..))")public void after() { System.out.println("後置通知被執行,無論異常都會呼叫"); }@AfterReturning("execution(* com.lu.spring.aop.service..*ServiceImpl.*(..))")public void afterReturning() { System.out.println("後置通知被執行,如果出現異常不呼叫"); }@AfterThrowing("execution(* com.lu.spring.aop.service..*ServiceImpl.*(..))")public void afterException() { System.out.println("異常通知被執行"); }@Around("execution(* com.lu.spring.aop.service..*ServiceImpl.*(..))")public Object around(ProceedingJoinPoint point) throws Throwable { System.out.println("環繞通知前"); Object proceed = point.proceed();//呼叫目標方法 System.out.println("環繞通知後");return proceed; }}
7.測試
packagecom.lu.spring.aop.service;importjavax.annotation.Resource;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.test.context.ContextConfiguration;importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)//建立容器@ContextConfiguration("classpath:applicationContext.xml")//從xxx.xml中找public class AopTest { @Resource(name="userService") private UserService userService; @Test public void testUpdate() {userService.update(); } @Test public void testSave() {userService.save("helen"); }}
結果: