spring aop

spring aop 面向切面編程

  1. 什么是aop
    aop 是面向切面編程,是一種編程思維肿孵,也是面向?qū)ο缶幊痰囊环N補(bǔ)充唠粥,面向?qū)ο髮⒊绦虺橄蟪筛鱾€層次的對象,而面向切面變成是將程序抽象給個切面
  2. 為什么需要aop
    為什么需要 aop了颁井,因為在我們開發(fā)中厅贪,很多時候有些方法里面有很多重復(fù)代碼,我們通常處理的方式是雅宾,粘貼來解決辦法养涮,還有的時候我們想在很多地方插入相同的代碼,比如日志等眉抬,我們可能會把相同代碼抽離處理贯吓,然后在需要的地方,來調(diào)用他蜀变,這樣這段代碼需要修改時悄谐,我們只需要改變這個方法就可以了,然而需求總在在變的库北,有一天爬舰,新增一個需求,需要在多出做修改寒瓦,情屹,我們需要在抽象一個方法,然后在需要的地方分別調(diào)用這個方法杂腰,又或者我們不需要這個方法了垃你,我們還是得刪除掉每一處調(diào)用該方法的地方,實際上涉及到多個地方具有相同的修改的問題我們度可以通過aop 來解決喂很。
  3. aop 術(shù)語
  • 通知(advice):AOP 框架中增強(qiáng)處理惜颇。通知描述了切面何時執(zhí)行預(yù)計如何執(zhí)行增強(qiáng)處理
  • 連接點(join point):連接點表示應(yīng)用執(zhí)行過程中能夠插入切面的一個點,這個點可以是方法的調(diào)用少辣,異常的拋出凌摄,spring aop 中,連接點終始方法調(diào)用漓帅。
  • 切點 (PointCut) : 可以插入增強(qiáng)處理的連接點
  • 切面 (Aspect) :切面是通知和切點的結(jié)合望伦。
  • 引入 (introduction):引入允許我們向現(xiàn)有的類添加新的方法或者屬性
  • 織入 (weaving) : 將增強(qiáng)處理添加到目標(biāo)對象中林说,并創(chuàng)建一個被增強(qiáng)的對象,這個過程就是織入屯伞。
  1. 簡單的使用
    我們使用springboot 整合aop,先導(dǎo)入aop 包
 <!-- 引入aop支持 -->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-aop</artifactId>
       </dependency>

我們使用 @Aspect 把一個類變成切面腿箩,使用@Component 把一個類交給spring 管理,使用@pointcut 注解把一個方法變成切點劣摇,通知

@Component
@Aspect
public class WebLogAop1 {
    //ThreadLocal保證不受其他線程影響珠移,用于記錄接口響應(yīng)時間
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<Long>();
    //切點
    @Pointcut("execution(public * com.ljh.mybatisplus.aop..*.*(..))")
    public void pointCut(){
        System.out.println("pointcut");
    }
    //通知
    //前置通知
    @Before(value = "pointCut()")
    public void doBefore(JoinPoint joinPoint){
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //請求的內(nèi)容,記錄url末融、method钧惧、ip
        System.out.println("URL==>" + request.getRequestURL().toString() + "," +
                "METHOD==>" + request.getMethod() + "," +
                "IP==>" + request.getRemoteAddr());
        Map<String, String[]> params = request.getParameterMap();
        Map<String,String> args = new HashMap<>();
        for (Map.Entry<String,String[]> temp : params.entrySet()) {
            args.put(temp.getKey(), Arrays.toString(temp.getValue()));
        }
        //連接點的簽名可以跟蹤到程序具體類、具體方法勾习,記錄一下方法和參數(shù)
        System.out.println("Before==>" + joinPoint.getSignature().getDeclaringTypeName() + "." +joinPoint.getSignature().getName() + "," +
                "ARGS==>" + args);
        //記錄請求接口開始時間
        threadLocal.set(System.currentTimeMillis());
       /* String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        System.out.println("The method " + methodName + " begins with " + Arrays.asList(args));*/
    }
    //后置返回通知
    @AfterReturning(pointcut = "pointCut()",returning = "returnMsg")
    public void doAfterReturn(JoinPoint joinPoint,Object returnMsg) {
        System.out.println("CLASS_METHOD==>" + joinPoint.getSignature().getDeclaringTypeName() + "." +
                joinPoint.getSignature().getName());
        //記錄一下接口響應(yīng)時間
        Long reponseTime = System.currentTimeMillis() - threadLocal.get();
        System.out.println("接口響應(yīng)時間(毫秒)==>" + reponseTime);
        //刪除threadLocal變量副本
        threadLocal.remove();
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            System.out.println(arg);
        }
    }
    //環(huán)繞通知
    @Around("pointCut()")
    public Object arround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object object = null;
        System.out.println("環(huán)繞通知開始");
        object =  proceedingJoinPoint.proceed();
        System.out.println("環(huán)繞通知結(jié)束");
        return object;
    }
    //異常通知
    @AfterThrowing(pointcut = "pointCut()",throwing = "exception")
    public void afterThrowing(JoinPoint joinPoint,Exception exception){
        String methodName = joinPoint.getSignature().getName();
                System.out.println("AfterThrowing The method " + methodName + " occurs exception: " + exception);
    }
 @After("pointCut()")
    public void after(JoinPoint joinPoint){
        System.out.println("最終通知");
    }
}

被增強(qiáng)的對象屬性和方法

@Component
public class Pointcut {
    public String showIndex(String a,String s){
        try {
            int i = 0;
            i = i/0;
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
        System.out.println("1");
        return a+"----"+s;
    }
    public String showIndex(int a,String b){
        return "";
    }
}

測試

@SpringBootTest
@RunWith(SpringRunner.class)
class MybatisplusApplicationTests {
   @Autowired
   public Pointcut pointcut;
   @Test
   public void test() {
       pointcut.showIndex("ljh","sdfs");
   }
   @Test
   public void test1() {
       pointcut.showIndex(15,"ljh");
   }
}
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浓瞪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子巧婶,更是在濱河造成了極大的恐慌乾颁,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艺栈,死亡現(xiàn)場離奇詭異英岭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)湿右,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門诅妹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毅人,你說我怎么就攤上這事吭狡。” “怎么了丈莺?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵划煮,是天一觀的道長。 經(jīng)常有香客問我场刑,道長,這世上最難降的妖魔是什么蚪战? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任牵现,我火速辦了婚禮,結(jié)果婚禮上邀桑,老公的妹妹穿的比我還像新娘瞎疼。我一直安慰自己,他們只是感情好壁畸,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布贼急。 她就那樣靜靜地躺著茅茂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪太抓。 梳的紋絲不亂的頭發(fā)上空闲,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音走敌,去河邊找鬼碴倾。 笑死,一個胖子當(dāng)著我的面吹牛掉丽,可吹牛的內(nèi)容都是我干的跌榔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼捶障,長吁一口氣:“原來是場噩夢啊……” “哼僧须!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起项炼,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤担平,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后芥挣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驱闷,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年空免,在試婚紗的時候發(fā)現(xiàn)自己被綠了空另。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹋砚,死狀恐怖扼菠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坝咐,我是刑警寧澤循榆,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站墨坚,受9級特大地震影響秧饮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泽篮,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一盗尸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帽撑,春花似錦泼各、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逆巍。三九已至,卻和暖如春莽使,著一層夾襖步出監(jiān)牢的瞬間锐极,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工吮旅, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留溪烤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓庇勃,卻偏偏與公主長得像檬嘀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子责嚷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容