欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring 面向切面編程AOP實現(xiàn)詳解

 更新時間:2019年09月09日 10:44:35   作者:幸福的小耗子  
這篇文章主要介紹了Spring 面向切面編程AOP實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

簡介

1、什么叫做面向切面編程?

概念:把一個個的橫切關注點(某種業(yè)務的實現(xiàn)代碼)放到某個模塊中去,稱之為切面。每個切面影響業(yè)務的一種功能,切面的目的就是為了功能增強,將需要增強的方法做成切面,實現(xiàn)對業(yè)務的增強,就是面向切面編程。

目的:將與業(yè)務本身無關,卻被業(yè)務模塊所共同調(diào)用的功能代碼封裝成切面,以減少系統(tǒng)的重復代碼,降低耦合,提高可擴展性。

優(yōu)勢:把多個方法前/后的共同代碼抽離出來,使用動態(tài)代理機制來控制,先執(zhí)行抽離出來的代碼,再執(zhí)行每一個真實方法.

2、Spring中的AOP使用動態(tài)代理來實現(xiàn):

  •   如果一個類實現(xiàn)了接口,那么spring就使用JDK的動態(tài)代理完成AOP;
  •   如果一個類沒有實現(xiàn)接口,那么spring就是用cglib完成AOP。

3、AOP的一些基本概念

  •   Joinpoint:連接點,被攔截到需要被增強的方法。去哪里做增強
  •   Pointcut:切入點,哪些包中的哪些類中的哪些方法,可認為是連接點的集合。去哪些地方做增強
  •   Advice:增強,當攔截到Joinpoint之后,在方法執(zhí)行的什么時機(when)做什么樣(what)的增強。
  •   Aspect:切面,Pointcut+Advice,去哪些地方+在什么時候+做什么增強
  •   Weaving:織入,把Advice加到Target上之后,創(chuàng)建出Proxy對象的過程。

切入點語法

1、execution(<訪問修飾符>?<返回值類型><聲明類型>?<方法名>(<參數(shù)名>)<異常名>)

?表示出現(xiàn)0次或1次

通配符:

* :匹配任何部分,只能表示一個單詞

 .. : 可用于全限定名中和方法參數(shù)中,分別表示子包和0到N個參數(shù)

2、實例介紹:

XML方式實現(xiàn)AOP

1、導入依賴

spring-aop  spring-aspectj

2、命名空間

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
"></beans>

3、配置AOP

<!--配置AOP-->
  <aop:config>
    <!--配置切入點pointcut
      哪些包里的哪些類需要被增強
    -->
    <aop:pointcut id="pointcut" expression="execution( * com.test.class03_AOP_xml.service.IUserService.*(..))"/>
    <!--配置切面Aspect
      Aspect=pointcut+Advice
    -->
    <aop:aspect ref="txManager">
      <!--前置增強-->
      <aop:before method="begin" pointcut-ref="pointcut"/>
      <!--后置增強-->
      <aop:after-returning method="commit" pointcut-ref="pointcut"/>
      <!--異常增強-->
      <aop:after-throwing method="rollback" pointcut-ref="pointcut"/>
      <!--最終增強-->
      <aop:after method="destroy" pointcut-ref="pointcut"/>
    </aop:aspect>
  </aop:config>

4、AOP中幾個不同的增強時機:

  •   aop:before(前置增強):在方法執(zhí)行之前執(zhí)行增強;
  •   aop:after-returning(后置增強):在方法正常執(zhí)行完成之后執(zhí)行增強;
  •   aop:after-throwing(異常增強):在方法拋出異常退出時執(zhí)行增強;
  •   aop:after(最終增強):在方法執(zhí)行之后執(zhí)行,相當于在finally里面執(zhí)行;可以通過配置throwing來獲得攔截到的異常信息
  •   aop:around(環(huán)繞增強):最強大的一種增強類型。

環(huán)繞增強可以在方法調(diào)用前后完成自定義的行為,環(huán)繞增強有兩個要求

1、方法要返回一個Object(返回的結(jié)果)

2、方法的第一個參數(shù)是ProceedingJoinPoint(可以繼續(xù)向下傳遞的切入點)

<!--環(huán)繞增強-->
<aop:around method="around" pointcut-ref="pointcut"/>

5、代碼示例

public class TxManager {
  public void begin() {
    System.out.println("開啟事務###");
  }
  public void commit() {
    System.out.println("提交事務++++++");
  }
  public void rollback() {
    System.out.println("回滾事務....");
  }
  public void destroy() {
    System.out.println("釋放資源……………………");
  }
  //環(huán)繞增強代碼示例
  public Object around(ProceedingJoinPoint pjp){
    Object obj=null;
    try {
      System.out.println("開啟事務###");
      obj=pjp.proceed();
      System.out.println("提交事務++++++");
    } catch (Throwable throwable) {
      throwable.printStackTrace();
      System.out.println("回滾事務....");
    }finally {
      System.out.println("釋放資源……………………");
    }
    return obj;
  }
}

6、獲取增強的參數(shù)

1.在增強方法中獲取異常的信息。

<aop:after-throwing>的標簽中添加throwing=“ex”的屬性

增強方法rollback中,添加形式參數(shù):Exception ex。

則形參ex中就自動注入了異常對象。 注意:throwing屬性的值,必須與方法中形參的名字相同

2.在增強方法中,獲取被增強方法的信息

Spring AOP提供org.aspectj.lang.JoinPoint類作為增強方法的第一個參數(shù)。

JoinPoint :提供訪問當前被增強方法的真實對象、代理對象、方法參數(shù)等數(shù)據(jù)。

ProceedingJoinPoint:JinPoint子類,只用于環(huán)繞增強中,可以處理被增強方法。

  •    jp.getThis():獲取代理對象
  •    jp.getTarget():獲取目標對象
  •    jp.getArgs():獲取被增強方法的參數(shù)
  •    jp.getSignature():獲取被增強方法的參數(shù)

注解方式實現(xiàn)AOP

1、命名空間

2、添加注解解析器<aop:aspect-autoproxy/>

3、@Aspect 切面,下面的注解都在切面里配置

  •   @before
  •   @AfterReturning
  •   @AfterThrowing
  •   @After
  •   @Around

4、代碼示例

@Aspect
public class TxManager {
  @Pointcut("execution( * com.test.class04_AOP_Anno.service.IUserService.*(..))")
  public void tt(){}
  @Before("tt()")
  public void begin() {
    System.out.println("開啟事務###");
  }
  @AfterReturning("tt()")
  public void commit() {
    System.out.println("提交事務++++++");
  }
  @AfterThrowing(value="tt()",throwing = "ex")
  public void rollback() {
    System.out.println("回滾事務....");
  }
  @After("tt()")
  public void destroy() {
    System.out.println("釋放資源……………………");
  }
  @Around("tt()")
  public Object around(ProceedingJoinPoint pjp){
    Object obj=null;
    try {
      System.out.println("開啟事務###");
      obj=pjp.proceed();
      System.out.println("提交事務++++++");
    } catch (Throwable throwable) {
      throwable.printStackTrace();
      System.out.println("回滾事務....");
    }finally {
      System.out.println("釋放資源……………………");
    }
    return obj;
  }
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論