<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Spring AOP 中的核心概念和建議類型 > 原文: [https://javatutorial.net/core-concepts-and-advice-types-in-aop-in-spring](https://javatutorial.net/core-concepts-and-advice-types-in-aop-in-spring) 如果您熟悉 Spring,可能已經聽說過面向方面的編程(AOP)。 那是 Spring 框架的主要組成部分之一。 ![spring-featured-image](https://img.kancloud.cn/64/23/64231db4bf6e880066d0d4c2e31ac166_780x330.jpg) 但是,不需要以前的 AOP 經驗。 它面向希望了解 Spring 中 AOP 框架如何工作的完整初學者。 在面向對象的編程中,可以通過使用**類**實現應用程序的模塊化。 在面向方面的編程中,它是通過**切片**實現的。 這些方面允許分離**切片** 。換句話說,它可以向現有代碼添加功能,而無需實際對其進行修改。 此外,我們可以分別聲明新功能和這些新行為。 ## AOP 中的核心概念 AOP 中有 7 個核心概念。 1. 業務對象:正常的業務邏輯。 2. 方面:實現跨多個類的企業應用程序關注點。 3. 連接點:應用程序中的特定點,例如變量值,異常處理,方法執行等。 4. 建議:針對特定連接點采取的操作。 5. 切入點:與連接點匹配的表達式,其目的是確定是否需要執行建議。 6. 目標對象:建議適用于此。 7. AOP 代理:使用 [JDK](https://javatutorial.net/install-java-8-jdk-on-ubuntu) 動態代理創建的 AOP 實現類,以使用目標類和建議調用/調用創建代理類。 8. 編織:將方面與其他對象鏈接在一起的過程,目的是創建建議的代理對象。 有關這些概念的更多信息,[請單擊此處](https://www.journaldev.com/2583/spring-aop-example-tutorial-aspect-advice-pointcut-joinpoint-annotations)。 要實現`Business`對象類,請看下面的示例: ```java public class Example { public String printHelloWorld() { return "Hello World!"; } public String printMessage(String msg) { return msg; } } ``` 這是完全普通的類,沒有任何與 Spring 相關的注釋。 ### AOP 建議類型 1. 在建議之前:這些建議在執行連接點方法之前運行。 要將建議類型標記為之前,我們可以使用`@Before`注釋。 2. 建議之后:這些建議在執行連接點方法之后運行。 要將建議類型標記為`After`,可以使用`@After`注解。 3. 返回建議之后:僅在連接點方法正常執行(不表示異常)時運行這些建議。 要將建議類型標記為“返回后”,我們可以使用`@AfterReturning`注解。 4. 拋出建議后:僅在連接點方法拋出異常時才運行這些建議(與“返回建議之后”相反)。 要將建議類型標記為“拋后”,我們可以使用`@AfterThrowing`注解。 5. 圍繞建議:這些建議為我們提供了靈活性,因為借助它們的使用,我們可以選擇是否執行連接點方法。 讓我們看看如何實現這些不同的建議類型。 **建議之前** ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class BeforeAdviceDemo { @Before("com.xyz.demoapp.SystemArchitecture.dataAccessOperation()") public void methodName() { // write code here } } ``` 通過使用`@Before`注解,我們指定這是一個`BeforeAdvice`。 **建議后** ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class AfterAdviceDemo{ @After("com.xyz.demoapp.SystemArchitecture.dataAccessOperation()") public void methodName() { // write code here } } ``` 與“建議之前”實現非常相似,只有我們將“之前”替換為“之后”。 **返回建議后** ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class AfterReturningAdviceDemo{ @AfterReturning("com.xyz.demoapp.SystemArchitecture.dataAccessOperation()") public void methodName() { // write code here } } ``` 你看到模式了嗎? **提出建議后** ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class AfterThrowingAdviceDemo { @AfterThrowing("com.xyz.demoapp.SystemArchitecture.dataAccessOperation()") public void methodName() { // write code here } } ``` **建議** `Around`類型的實現有些棘手。 由于這種類型的建議可以在方法執行之前和之后執行工作,因此它需要以線程安全的方式共享該方法執行之前和之后的狀態。 要指定建議類型,我們使用`@Around`注釋,該建議方法的第一個參數必須為`ProceedingJoinPoint`類型。 要執行基礎方法,我們需要調用`proced()`。 ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.ProceedingJoinPoint; @Aspect public class AroundAdviceDemo { @Around("com.xyz.demoapp.SystemArchitecture.businessService()") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { Object value = pjp.proceed(); // return the object return value; } } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看