亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring AOP的示例分析

發布時間:2021-09-08 15:25:16 來源:億速云 閱讀:159 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“Spring AOP的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Spring AOP的示例分析”這篇文章吧。

Spring中對AOP的支持

Spring中AOP代理由Spring的IoC容器負責生成、管理,其依賴關系也由IoC容器負責管理。因此,AOP代理可以直接使用容器中的其他Bean實例作為目標,這種關系可由IoC容器的依賴注入提供。Spring默認使用Java動態代理來創建AOP代理,這樣就可以為任何接口實例創建代理了。當需要代理的類不是代理接口的時候,Spring自動會切換為使用CGLIB代理,也可強制使用CGLIB。

本例子的邏輯如下:有一個Car類(業務類),在Car類中的go方法運行之前和之后,都會有相應的日志記錄,但Car類本身并不知道日志的任何邏輯。

創建Maven項目并添加依賴

首先,新建一個Maven項目,使用 maven‐archetype‐quickstart模板,然后打開pom.xml文件,加入Spring AOP運行需要的依賴包

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.0.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>4.0.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.0.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>4.0.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.8.1</version>
</dependency>

編寫業務代碼

新增一個業務類Car,包含一個go()方法

package com.wowo.spring_aop_demo1;
public class Car {
  public void go(){
    System.out.println("go go go!");
  }
}

編寫切面類

日志類會記錄下系統的運行情況,但日志的邏輯不會在業務類中寫的到處都是,而是作為一個切面類存在。

package com.wowo.spring_aop_demo1;
public class CarLogger {
  public void beforeRun(){
    System.out.println("car is going to run");
  }
  public void afterRun(){
    System.out.println("car is running");
  }
}

該切面類包含兩個方法,他們分別是前置通知和后置通知。

通過bean來配置關聯

新增一個配置文件,本例命名為bean.xml,在配置文件中來關聯切面與通知

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-2.5.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd"
  >
  <bean id="car" class="com.wowo.spring_aop_demo1.Car"/>
  <bean id="logger" class="com.wowo.spring_aop_demo1.CarLogger" />
  <aop:config>
    <aop:aspect ref="logger">
      <aop:pointcut expression="execution(* com.wowo.spring_aop_demo1.Car.go(..))" id="go"/>

      <aop:before pointcut-ref="go" method="beforeRun" />
      <aop:after pointcut-ref="go" method="afterRun" />
    </aop:aspect>
  </aop:config>
</beans>

注意:這個配置文件中,aop的命名空間,以及xsi:schemaLocation中包含的幾個地址都是必須的。
execution(* com.wowo.spring_aop_demo1.Car.go(..))是一個AspectJ切點表達式,execution表示在執行時觸發,后面的*表示任意類型的返回值,com.wowo.spring_aop_demo1.Car指的是切點所在的類,go(..)是方法名,..表示任意參數。

Spring切面可以應用5種類型的通知:

·Before——在方法被調用之前調用通知
·After——在方法完成之后調用通知,無論方法是否執行成功
·After-returning——在方法成功執行之后調用通知
·After-throwing——在方法拋出異常后調用通知
·Around——通知包裹了被通知的方法,在被通知的方法調用之前和調用之后都執行自定義的行為

運行業務代碼

下面創建一個包含main()方法的類,來運行業務代碼

package com.wowo.spring_aop_demo1;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App 
{
  public static void main( String[] args )
  {
    ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    Car car=(Car) context.getBean("car");
    car.go();
  }
}

在上面的代碼中,由Spring創建了一個car對象。Spring在創建該對象時,發現它的一個方法被配置成了切點(pointcut),所以,在實例化該對象時,會創建一個代理對象,當切點方法go()執行時,會被Spring創建的代理對象所攔截,運行go方法之前,會調用所對應的切面類CarLogger的前置方法beforeRun(),然后調用Car.go()方法,再然后就調用切面類CarLogger的后置方法afterRun()。

注意:必須使用Spring創建包含切點的對象,如果自己創建的話,Spring是監測不到的,它的運行也不會被應用任何通知。

項目輸出結果為

car is going to run
go go go!
car is running

使用環繞通知

如果想使用環繞通知,我們需要修改切面類中的通知方法以及配置文件,業務類無需做任何修改,因為他們是完全解耦的。首先修改切面類CarLogger

import org.aspectj.lang.ProceedingJoinPoint;
public class CarLogger {

  public void aroundRun(ProceedingJoinPoint joinpoint){
    System.out.println("car is going to run");
    try {
      //調用被代理的對象的目標方法,本例中指向Car.go()方法
      joinpoint.proceed();
    } catch (Throwable e) {
      e.printStackTrace();
    }
    System.out.println("car is running");
  }
}

環繞通知的方法,需要接受ProceedingJoinPoint類型的參數,其proceed()方法將會調用被代理對象的目標方法,所以,正常情況下,這個方法一定要調用。我們也可以通過不調用該方法來組織被代理對象的運行。

接下來將配置文件的aop:config部分修改為如下所示

<aop:config>
    <aop:aspect ref="logger">
      <aop:pointcut expression="execution(* com.wowo.spring_aop_demo1.Car.go(..))" id="go"/>
      <aop:around method="aroundRun" pointcut-ref="go"/>
    </aop:aspect>
  </aop:config>

注意:環繞通知不能和前置/后置通知同時存在。運行代碼后,輸出結果不變。

以上是“Spring AOP的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苗栗市| 潍坊市| 民县| 荥阳市| 罗山县| 鹰潭市| 文登市| 霍林郭勒市| 东城区| 犍为县| 青冈县| 阿瓦提县| 姚安县| 伊川县| 台州市| 安康市| 张家界市| 海安县| 郑州市| 丘北县| 广灵县| 九江县| 筠连县| 靖边县| 古浪县| 顺义区| 岐山县| 屏东县| 墨玉县| 班玛县| 汉源县| 崇阳县| 平乐县| 图们市| 庐江县| 滦平县| 贵南县| 兰西县| 泽库县| 南通市| 河池市|