Spring Boot with AOP
手頭上的專案使用了Spring Boot, 在高併發的情況下,經常出現樂觀鎖加鎖失敗的情況(OptimisticLockingFailureException,同一時間有多個執行緒在更新同一條資料)。為了減少直接向服務使用者直接返回失敗結果的情況,可以使用這種方式解決這個問題:
- 捕獲到OptimisticLockingFailureException之後,嘗試一定次數的重試。超過重試次數再報錯
- 為了不修改原有的業務方法的程式碼,使用AOP來實現錯誤處理功能
先通過一個RESTFul應用看看Spring Boot怎麼用AOP,之後再來處理樂觀鎖加鎖失敗的問題。關於怎麼用Spring Boot建立RESTFul應用不在這裡細說了。
1.Maven依賴包
1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-web</artifactId> 5 <version>1.2.6.RELEASE</version> 6 </dependency> 7 <!-- AOP的依賴包--> 8 <dependency> 9 <groupId>org.springframework.boot</groupId> 10 <artifactId>spring-boot-starter-aop</artifactId> 11 <version>1.2.6.RELEASE</version> 12 </dependency> 13 14 <dependency> 15 <groupId>junit</groupId> 16 <artifactId>junit</artifactId> 17 <scope>test</scope> 18 <version>4.12</version> 19 </dependency> 20 </dependencies>
2.建立切面定義類
請注意這裡用到的幾個標籤都是必須的,否則沒效果。
1 @Aspect 2 @Configuration 3 public class HelloAspect { 4 5 //切入點在實現類的方法,如果在介面,則會執行doBefore兩次 6 @Pointcut("execution(* com.leolztang.sb.aop.service.impl.*.sayHi(..))") 7 public void pointcut1() { 8 } 9 10 @Around("pointcut1()") 11 public Object doBefore(ProceedingJoinPoint pjp) throws Throwable { 12 System.out.println("doBefore"); 13 return pjp.proceed(); 14 } 15 }
3.在應用程式配置檔案application.yml中啟用AOP
spring.aop.auto: true
完成之後啟動App,使用RESTFul客戶端請求http://localhost:8080/greeting/{name}就可以看到控制檯有輸出"doBefore",說明AOP已經生效了。
原始碼地址:http://files.cnblogs.com/files/leolztang/sb.aop.tar.gz