国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

SpringAOP 構造注入的實(shí)現步驟

發(fā)布時(shí)間:2021-07-17 21:51 來(lái)源:腳本之家 閱讀:0 作者:Lachlan_Yang 欄目: 編程語(yǔ)言 歡迎投稿:712375056

目錄

      AOP_面向切面編程初步了解

      讓我們先想象一個(gè)場(chǎng)景,你正在編寫(xiě)一個(gè)項目,在開(kāi)發(fā)過(guò)程中的多個(gè)模塊都有某段重復的代碼,于是你選擇將其抽象成一個(gè)方法,然后在需要的地方調用這個(gè)方法,當需要修改這段代碼時(shí)只需要修改這個(gè)方法就行。有一天,你的Boss給了新的需求,需要再抽象出一個(gè)方法,然后再在各個(gè)需要這個(gè)方法的模塊調用這個(gè)方法,這可能就讓你頭疼了,需要修改大量的代碼,于是會(huì )想,能不能不修改源代碼為系統業(yè)務(wù)添加某種功能呢?幸運的是,AOP可以很好的解決這個(gè)問(wèn)題。

      簡(jiǎn)單介紹

      AOP:保證開(kāi)發(fā)者不修改源代碼的前提下,去為系統中的業(yè)務(wù)組件添加某種通用功能,本質(zhì)是由AOP框架修改業(yè)務(wù)組件的多個(gè)方法的源代碼,我們將其分為兩類(lèi):

      • 靜態(tài)AOP

      AOP 框架在編譯階段對程序源代碼進(jìn)行修改,生成了靜態(tài)的 AOP 代理類(lèi)(生成的*.class文件已經(jīng)被改掉了,需要使用特定的編譯器),比如 AspectJ。

      • 動(dòng)態(tài)AOP:

      AOP 框架在運行階段對動(dòng)態(tài)生成代理對象(在內存中以 JDK 動(dòng)態(tài)代理,或 CGlib 動(dòng)態(tài)地生成 AOP 代理類(lèi)),如 SpringAOP。

      詳細說(shuō)明

      Spring 的通知類(lèi)型

      實(shí)戰演練

      導入依賴(lài)包

          <dependencies>
              <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-context</artifactId>
                  <version>5.3.5</version>
              </dependency>
              <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-aspects</artifactId>
                  <version>5.3.5</version>
              </dependency>
              <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
              <dependency>
                  <groupId>org.aspectj</groupId>
                  <artifactId>aspectjweaver</artifactId>
                  <version>1.9.6</version>
              </dependency>
              <!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
              <dependency>
                  <groupId>aopalliance</groupId>
                  <artifactId>aopalliance</artifactId>
                  <version>1.0</version>
              </dependency>
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>4.12</version>
                  <scope>test</scope>
              </dependency>
          </dependencies>

      創(chuàng )建一個(gè)增強類(lèi)以及其接口

      增強類(lèi)接口:

      public interface VisitService {
          //用于實(shí)現前置通知,后置通知,異常通知,最終通知
          void visit(String str) throws Exception;
      
          //用于實(shí)現環(huán)繞通知
          void around();
      }

      增強類(lèi):

      public class VisitServiceImpl implements VisitService {
          //前置,后置,最終,異常通知的增強類(lèi)
          public void visit(String str) throws Exception{
              System.out.println(str);
              if(!str.equalsIgnoreCase("agree")){
                  throw new Exception("非法訪(fǎng)問(wèn)");
              }
          }
          //環(huán)繞通知的增強類(lèi)
          public void around() {
              System.out.println("環(huán)繞通知");
          }
      }

      創(chuàng )建一個(gè)切面類(lèi)

      @Component("VisitAspect")
      @Aspect //標注當前myAspect是一個(gè)切面類(lèi)
      public class VisitAspect_anno {
          // 定義切入點(diǎn)表達式
          // 使用一個(gè)返回值為 void 、方法體為空的方法來(lái)命名切入點(diǎn)
          @Pointcut("execution(* Spring_AOP.service.impl.VisitServiceImpl.visit(..))")
          private void v1() {
          }
      
          //前置通知
          @Before("v1()")
          public void visitBefore(JoinPoint joinPoint) {
      
              System.out.println("口令:");
          }
      
          @After("v1()")
          //最終通知,無(wú)論是否報錯,都執行
          public void visitAfter(JoinPoint joinPoint) {
              System.out.println("輸入完成");
          }
      
          @AfterReturning("v1()")
          //后置通知報錯不執行
          public void visitSuccess(JoinPoint joinPoint) {
              System.out.println("請求成功,歡迎");
          }
      
          @AfterThrowing(value = "v1()",throwing = "ex")
          //異常通知,報錯后執行
          public void visitThrow(JoinPoint joinPoint, Throwable ex) {
              System.out.println("請求失敗,拒絕");
          }
      
          @Around("execution(* Spring_AOP.service.impl.VisitServiceImpl.around())")
          //環(huán)繞通知,如果報錯只執行前一句
          public Object visitAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
              System.out.println("-------環(huán)繞-------");
              Object obj = proceedingJoinPoint.proceed();
              System.out.println("------------------");
              return obj;
          }
      }

      配置xml文件

          <!-- 基于注解的聲明式 AspectJ -->
          <context:component-scan base-package="Spring_AOP" />
          <!-- 啟動(dòng)基于注解的聲明式 AspectJ 支持一 -->
          <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

      創(chuàng )建一個(gè)測試類(lèi)

       public class visitTest {
          @Test
          public void VisitTest(){
              ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext_AOP.xml");
              VisitService visitService = app.getBean(VisitService.class);
              try {
                  visitService.visit("agree");
              } catch (Exception e) {
                  e.printStackTrace();
              }
              try {
                  visitService.visit("ok");
              } catch (Exception e) {
                  e.printStackTrace();
              }
              visitService.around();
          }
      }

      測試運行

      口令:
      agree
      請求成功,歡迎
      輸入完成
      口令:
      ok
      請求失敗,拒絕
      輸入完成
      -------環(huán)繞-------
      環(huán)繞通知
      -------環(huán)繞-------

      總結

      使用構造注入可以更方便的實(shí)現AOP模式,但是同樣與設置注入相比各有千秋。
      以上就是以注解實(shí)現SpringAOP框架構造注入的實(shí)現,如有錯誤,麻煩指出,感謝耐心到現在的朋友ᕕ( ᐛ )ᕗ

      到此這篇關(guān)于SpringAOP_構造注入的實(shí)現步驟的文章就介紹到這了,更多相關(guān)SpringAOP_構造注入內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

      免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

      国产精品成人一区二区三区| 日韩一区二区三区精品| 亚洲AV成人片色在线观看吉沢| LED字幕乱码| 精品性影院一区二区三区内射| 国产三级AV在线播放|