日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自定义注解事务课程回顾

發布時間:2024/4/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义注解事务课程回顾 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
你們對事務的基本原理理解了沒有,事務的整個原理,聲明式事務的原理,就相當于我完全自動化的,他自動通過掃包或者注解,給我進行實現的,這種方式我們都叫做聲明式的,還是不夠底層,封裝的還不夠好,今天就有點難度了,所以你們待會要認真聽一下,任何聲明事務,他都是基于編程事務進行實現出來的,聲明事務他分為兩種,第一種我們稱為xml方式,xml方式你們可以這樣去理解,加一個掃包范圍,然后在這個掃包范圍里面,你可以去開啟一個事務,有沒有印象,我記得我那會我剛學Spring的時候,比如我在com.learn.service這個包下面,只要有get,save方法,我們都會加事務,然后在這里還有一個注解版本的,那么我們今天講個比較難的,就是以什么配置開頭的,這種屬于xml方式,什么以add開頭,以save開頭的我就開啟事務,以get開頭的,我就不給他開啟事務,這種配置比較老了,一般我們記住啊,因為你們在今后的時候都會學到,比如舉個例子,save*星號,update*星號,insert*星號,有沒有印象,通過方法名進行區分事務,還有一種事務你們是絕對用過的,叫做注解版本的,你們用過@Transaction注解沒有,這是不是注解版本的,然后我加到方法里面去的時候,我就表示方法開啟這個事務,今天講一下這個底層是怎么實現的,為什么我要加上一個注解,能夠幫我去做事務管理,有沒有人能告訴我他的原理是什么,我們今天講的有點難度,寫代碼量有點大,為什么在方法上加入@Transaction注解的時候,他能夠開啟事務,你們要知道原理,我點進去,什么都沒有,沒有源代碼,這個其實我告訴你們,其實怎么做的呢,其實我們今天講什么原理呢,就是我們自己寫一個事務注解出來,然后實現@Transaction一模一樣的功能,完全一模一樣的功能,但是我們可能沒有時間玩,我們上課時間也有限,具體功能你們下課自己去玩一下,這個思路是我自己想的,不是說我看過他源碼怎么做,因為我不喜歡看別人源碼,因為我不看你源碼我也能實現你的效果,所以我在這里講一下,你們學任何技術的時候,別人代碼怎么寫的時候,我就抄過來,那就沒意義,要有自己的一套思路,這就叫編程思想,所以在這邊,再說一句話,叫編程思想,今后我們的HashMap和HashSet,分布式事務框架,都是按照我們自己的思路寫的,和別人的代碼寫的有差別,但是最終都達到一個效果,那么今天我們同學可能也知道,我們今天要實現一個自定義注解出來,實現他的一個效果,那么什么效果呢,比如我現在加一個注解,這個注解我自己寫的,叫@ExtTrasaction注解,這個注解是我自己寫出來的,只要加上這個注解之后,那么我就可以在這個方法之前和之后做一個事務管理機制,不知道你們有沒有用過lcn框架沒有,他在里面是不是有這樣的一種功能,需要在發起方加入一個注解,要在發起方的方法上加一個注解,這個注解可以解決一個分布式問題,是不是這樣的,他使用的也是自定義注解,那他這個是怎么進行實現的呢,我們大致看一下源碼好吧 package com.learn.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;//事務注解 設置傳播行為 @Target({ ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface ExtTransaction {} package com.learn.transaction;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.stereotype.Component; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.interceptor.DefaultTransactionAttribute;/*** 我們把事務utils改成原型模式* 就是一個線程安全的* 每個事務都是一個單獨的實例* 這樣就可以解決一個高并發的一個線程安全問題* * @author Leon.Sun**/ //編程事務(需要手動begin 手動回滾 手都提交) @Component @Scope("prototype") // 每個事務都是新的實例 目的解決線程安全問題 多例子 public class TransactionUtils {// 全局接受事務狀態private TransactionStatus transactionStatus;// 獲取事務源@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;// 開啟事務public TransactionStatus begin() {System.out.println("開啟事務");transactionStatus = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());return transactionStatus;}// 提交事務public void commit(TransactionStatus transaction) {System.out.println("提交事務");dataSourceTransactionManager.commit(transaction);}// 回滾事務public void rollback() {System.out.println("回滾事務...");dataSourceTransactionManager.rollback(transactionStatus);}} package com.learn.aop;import java.lang.reflect.Method;import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.TransactionStatus;import com.learn.annotation.ExtTransaction; import com.learn.transaction.TransactionUtils;//自定義事務注解具體實現 /*** 我自己做了一個封裝* 也是通過代理設計模式去攔截* 為什么代理設計模式也會攔截到注解呢* 這個待會我講一下底層的實現原理* 你就知道是怎么做的* 這段代碼就可以自定注解* 然后實現我對事物的一個管理* 其實這個大體不是很難* 但是我為什么要講這個呢* 我覺得大家要學會一種思想* 以后你們一聽就說* 我們今天要手寫一個@Transaction注解出來* 舉得這個我不會* 這個很高大上* 那么我告訴你一下* 當你學完以后會發現* 這個東西沒什么難的* 就是沒什么了不起的* 就是這樣的* 你會了以后眼界就完全不一樣了* 這個我可以直說的* 我這邊給大家說一下* 你們下去的時候自己去看一下一些源碼* 也可以下去看一下* 我提前說幾個任務* 最好下去大致去了解一下* 我們接下來馬上要講到了* 你們自己下去去研究一下原理* 你可以去百度上找個文章* 去看一下ArrayList是怎么實現的* 但是我是這么覺得的* 我覺得最難的一個知識是在哪里呢* 一個是手寫集合框架* 一個是手寫數據庫連接池* 這兩個是比較難的* 可以去網上看一下有沒有寫數據庫連接池* 我大體把思路告訴你們* 你們去預習一下* 否則你們當天會覺得有點抽象* 連接池的實現原理* 其實數據庫連接池的原理* 和線程池原理一模一樣* 里面也是用到了并發* 到時候我們講手寫ORM框架的時候* 就是實現一個簡單版的數據庫連接池* 做一個注解版本的ORM映射* 映射到表里面自動生成一個SQL語句* 就是類似于一個hibernate語句* 最后分享一下mybatis的api* 所以呢我們就不會講到API了* 然后HashMap是我覺得比較難的* 要學這個數據結構* 像紅黑樹啊* 鏈表 數組* 這些數據結構* 所以這兩個可能是你們覺得最難的那個* 然后后序的時候* 尤其是我們分布式微服務講完的時候* 然后就會講到分布式事務的一個框架* 我們當天就寫一個框架出來* 你寫出來的時候你對分布式事務的眼界* 絕對是不一樣的* 就是一個大的亮點* 我們到時候會手寫RPC* 這個手寫SpringCloud會簡單點* 寫dubbo會比較難一點* 因為SpringCloud是基于http的* 底層是通過http封裝起來的* 所以這個就比較簡單了* 然后TOMCAT就稍微有點難度了* 基于多線程加線程池* netty框架加NIO* 主要是寫一個request和響應出來就OK了* 我們大概要講兩個信息* 大概講到月底把整個源碼講完* 這可能有點難度* 代碼量也比較大* 大家最好是打一遍* 不要聽我上課講* 一定要去敲一遍* * * * * @author Leon.Sun**/ @Aspect @Component public class AopExtTransaction { // 一個事務實例子 針對一個事務 @Autowired private TransactionUtils transactionUtils;// 使用異常通知進行 回滾事務 @AfterThrowing("execution(* com.learn.service.*.*.*(..))") public void afterThrowing() {// 獲取當前事務進行回滾// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();transactionUtils.rollback(); }// 環繞通知 在方法之前和之后處理事情 @Around("execution(* com.learn.service.*.*.*(..))") public void around(ProceedingJoinPoint pjp) throws Throwable {// 1.獲取該方法上是否加上注解ExtTransaction extTransaction = getMethodExtTransaction(pjp);TransactionStatus transactionStatus = begin(extTransaction);// 2.調用目標代理對象方法pjp.proceed();// 3.判斷該方法上是否就上注解commit(transactionStatus); }private TransactionStatus begin(ExtTransaction extTransaction) {if (extTransaction == null) {return null;}// 2.如果存在事務注解,開啟事務return transactionUtils.begin(); }private void commit(TransactionStatus transactionStatus) {if (transactionStatus != null) {// 5.如果存在注解,提交事務transactionUtils.commit(transactionStatus);}}// 獲取方法上是否存在事務注解 private ExtTransaction getMethodExtTransaction(ProceedingJoinPoint pjp)throws NoSuchMethodException, SecurityException {String methodName = pjp.getSignature().getName();// 獲取目標對象Class<?> classTarget = pjp.getTarget().getClass();// 獲取目標對象類型Class<?>[] par = ((MethodSignature) pjp.getSignature()).getParameterTypes();// 獲取目標對象方法Method objMethod = classTarget.getMethod(methodName, par);ExtTransaction extTransaction = objMethod.getDeclaredAnnotation(ExtTransaction.class);return extTransaction; }}

?

總結

以上是生活随笔為你收集整理的自定义注解事务课程回顾的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。