<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Spring AOP – AspectJ 注解配置示例 > 原文: [https://howtodoinjava.com/spring-aop/spring-aop-aspectj-example-tutorial-using-annotation-config/](https://howtodoinjava.com/spring-aop/spring-aop-aspectj-example-tutorial-using-annotation-config/) Spring 的關鍵組件之一是[面向切面編程(AOP)](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html)框架。 盡管 Spring IoC 容器不依賴于 AOP,這意味著您不需要時就不需要使用 AOP,但 AOP 是對 Spring IoC 的補充,可以提供功能強大的中間件解決方案。 就像 OOP 中模塊化的關鍵單元是類,AOP 中模塊化的單元是切面。 切面使關注點(也可以理解為橫切關注點)實現模塊化,例如跨多種類型和對象的事務管理。 AspectJ 已成長為一個完整且流行的 AOP 框架,Spring 支持在其 AOP 框架中使用以 [AspectJ](https://eclipse.org/aspectj/) 注解編寫的 POJO 切面。 由于越來越多的 AOP 框架支持 AspectJ 注解,因此您的 AspectJ 樣式的切面更有可能在支持 AspectJ 的其他 AOP 框架中重用。 **不幸的是**,AOP 術語不是很直觀,因此我將首先創建一個示例應用程序,然后將這些術語與示例中的用法相關聯。 ## Spring AOP + AspectJ 示例 在編寫任何代碼之前,您將需要將 Spring AOP 依賴項導入到您的項目中。 ```java <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.11</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.11</version> </dependency> ``` 在此示例中,我采用`EmployeeManager`類的非常基本的實現,該實現具有一些方法集,這些方法應基本上將`EmployeeDTO`對象選擇/修改為數據庫。 `EmployeeDTO.java` ```java public class EmployeeDTO { private Integer id; private String firstName; private String lastName; //Setters and Getters } ``` `EmployeeManager.java` ```java import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Component; @Component public class EmployeeManager { public EmployeeDTO getEmployeeById(Integer employeeId) { System.out.println("Method getEmployeeById() called"); return new EmployeeDTO(); } public List<EmployeeDTO> getAllEmployee() { System.out.println("Method getAllEmployee() called"); return new ArrayList<EmployeeDTO>(); } public void createEmployee(EmployeeDTO employee) { System.out.println("Method createEmployee() called"); } public void deleteEmployee(Integer employeeId) { System.out.println("Method deleteEmployee() called"); } public void updateEmployee(EmployeeDTO employee) { System.out.println("Method updateEmployee() called"); } } ``` 然后,我創建了一個日志記錄切面,它將記錄執行了哪個方法。 `EmployeeCRUDAspect.java` ```java @Aspect public class EmployeeCRUDAspect { @Before("execution(* EmployeeManager.getEmployeeById(..))") public void logBeforeV1(JoinPoint joinPoint) { System.out.println("EmployeeCRUDAspect.logBeforeV1() : " + joinPoint.getSignature().getName()); } @Before("execution(* EmployeeManager.*(..))") public void logBeforeV2(JoinPoint joinPoint) { System.out.println("EmployeeCRUDAspect.logBeforeV2() : " + joinPoint.getSignature().getName()); } @After("execution(* EmployeeManager.getEmployeeById(..))") public void logAfterV1(JoinPoint joinPoint) { System.out.println("EmployeeCRUDAspect.logAfterV1() : " + joinPoint.getSignature().getName()); } @After("execution(* EmployeeManager.*(..))") public void logAfterV2(JoinPoint joinPoint) { System.out.println("EmployeeCRUDAspect.logAfterV2() : " + joinPoint.getSignature().getName()); } } ``` `applicationContext.xml`文件具有以下配置,以使用注解配置來啟用 AOP 和 IoC 容器。 ```java <aop:aspectj-autoproxy /> <context:component-scan base-package="com.howtodoinjava.demo.aop" /> <bean id="loggingAspect" class="com.howtodoinjava.demo.aop.EmployeeCRUDAspect" /> ``` 現在測試 AOP 配置和其他內容。 ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestAOP { @SuppressWarnings("resource") public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("com/howtodoinjava/demo/aop/applicationContext.xml"); EmployeeManager manager = context.getBean(EmployeeManager.class); manager.getEmployeeById(1); manager.createEmployee(new EmployeeDTO()); } } Output: EmployeeCRUDAspect.logBeforeV1() : getEmployeeById EmployeeCRUDAspect.logBeforeV2() : getEmployeeById Method getEmployeeById() called EmployeeCRUDAspect.logAfterV1() : getEmployeeById EmployeeCRUDAspect.logAfterV2() : getEmployeeById EmployeeCRUDAspect.logBeforeV2() : createEmployee Method createEmployee() called EmployeeCRUDAspect.logAfterV2() : createEmployee ``` 很好,AOP 配置成功。 現在繼續學習 AOP 術語。 ## AOP 關鍵概念 現在讓我們定義一些中心的 AOP 概念和術語,并與上面的示例相關聯。 ![spring-aop-diagram](https://img.kancloud.cn/b0/ea/b0ea6db74223087a001891731df99d5b_410x372.jpg) **1)切面**:涉及多個類別的關注點的模塊化。 事務管理是企業 Java 應用程序中橫切關注的一個很好的例子。 在我們的示例中,我們創建了一個日志記錄切面。 要創建切面,您需要在切面類上應用`@Aspect`注解并將其注冊到`applicationContext.xml`文件中。 ```java @Aspect public class EmployeeCRUDAspect { ... } ``` 這是您將切面注冊到上下文中的方式。 ```java <bean id="loggingAspect" class="com.howtodoinjava.demo.aop.EmployeeCRUDAspect" /> ``` 請記住首先使用`<aop:aspectj-autoproxy/>`將 AOP 支持添加到您的上下文中。 **2)連接點**:在程序執行期間的點,例如方法的執行或異常的處理。 在 Spring AOP 中,連接點始終代表方法的執行。 在我們的示例中,`EmployeeManager`內部定義的所有方法都是連接點。 **3)建議:某個切面在特定連接點采取的**操作。 不同類型的建議包括“周圍”,“事前”和“事后”建議。 許多 AOP 框架(包括 Spring)將建議建模為攔截器,并在連接點周圍維護了一系列攔截器。 在我們的示例中,所有`logBefore()`和`logAfter()`方法都是建議。 **4)切入點**:與連接點匹配的謂詞。 建議與切入點表達式關聯,并在與該切入點匹配的任何連接點處運行(例如,執行具有特定名稱的方法)。 切入點表達式匹配的連接點的概念是 AOP 的核心,默認情況下,Spring 使用 AspectJ 切入點表達語言。 在我們的示例中,在`@Before`和`@After`注解(即`execution(* EmployeeManager.getEmployeeById(..))`)中傳遞的表達式是切入點。 **5)簡介**:代表類型聲明其他方法或字段。 Spring AOP 允許您向任何建議對象引入新接口(和相應的實現)。 例如,您可以使用簡介使 Bean 實現`IsModified`接口,以簡化緩存。 我將為此創建一個單獨的示例。 **6)目標對象**:對象由一個或多個切面建議。 也稱為建議對象。 由于 Spring AOP 是使用運行時代理實現的,因此該對象將始終是代理對象。 在我們的示例中,建議使用`EmployeeManager`對象,因此它是目標對象。 **7)AOP 代理**:由 AOP 框架創建的對象,用于實現切面協定(建議方法執行等)。 在 Spring 框架中,AOP 代理將是 JDK 動態代理或 CGLIB 代理。 在我們的示例中,當我們向`EmployeeManager`類的 bean 引用詢問時,將創建一個代理對象。 您可以在下圖中看到代理的類,該類是運行時調試器的屏幕截圖。 ![spring-aop-proxy-object](https://img.kancloud.cn/5e/24/5e241199ec54a3bdbf02a6bef7ba97ea_613x197.jpg) 因此,我們現在很好,可以將 spring AOP 的關鍵術語與實際代碼關聯起來。 現在,讓我們進一步列出**類型的建議**,這些建議可在 Spring AOP 中使用。 1. **事前建議**:建議在連接點之前執行,但不具有阻止執行流程前進到連接點的能力(除非它引發異常)。 要使用此建議,請使用上面示例中使用的`@Before`注解。 2. **返回后建議**:在連接點正常完成后要執行的建議:例如,如果某個方法返回而沒有引發異常。 要使用此建議,請使用`@AfterReturning`注解。 3. **拋出后建議**:如果方法因引發異常而退出,則要執行的建議。 要使用此建議,請使用`@AfterThrowing`注解。 4. **事后建議**:無論連接點退出的方式如何(正常或特殊返回),均應執行的建議。 要使用此建議,請在上面的示例中使用`@After`注解。 5. **周圍建議**:圍繞連接點的建議,例如方法調用。 這是最有力的建議。 要使用此建議,請使用`@Around`注解。 周圍建議可以在方法調用之前和之后執行自定義行為。 它還負責選擇是返回連接點還是通過返回其自身的返回值或引發異常來捷徑建議的方法執行。 周圍的建議可以編寫如下。 ```java @Around("execution(* EmployeeManager.getEmployeeById(..))") public void logAround(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("Write code for before advise"); joinPoint.proceed(); //continue to called method i.e. EmployeeManager.getEmployeeById() System.out.println("Write code for after advise"); } ``` 這就是本入門教程的全部內容。 我將發布更多的教程,其中包含 **spring Aspectj aop 概念**的更多詳細信息。 **祝您學習愉快!** **參考**:[Spring 文檔](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html)
                  <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>

                              哎呀哎呀视频在线观看