最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

簡(jiǎn)介

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

概念:把一個(gè)個(gè)的橫切關(guān)注點(diǎn)(某種業(yè)務(wù)的實(shí)現(xiàn)代碼)放到某個(gè)模塊中去,稱(chēng)之為切面。每個(gè)切面影響業(yè)務(wù)的一種功能,切面的目的就是為了功能增強(qiáng),將需要增強(qiáng)的方法做成切面,實(shí)現(xiàn)對(duì)業(yè)務(wù)的增強(qiáng),就是面向切面編程。

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

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

2、Spring中的AOP使用動(dòng)態(tài)代理來(lái)實(shí)現(xiàn):

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

3、AOP的一些基本概念

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

切入點(diǎn)語(yǔ)法

1、execution(<訪(fǎng)問(wèn)修飾符>?<返回值類(lèi)型><聲明類(lèi)型>?<方法名>(<參數(shù)名>)<異常名>)

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

通配符:

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

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

2、實(shí)例介紹:

XML方式實(shí)現(xiàn)AOP

1、導(dǎo)入依賴(lài)

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

4、AOP中幾個(gè)不同的增強(qiáng)時(shí)機(jī):

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

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

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

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

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

5、代碼示例

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

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

1.在增強(qiáng)方法中獲取異常的信息。

<aop:after-throwing>的標(biāo)簽中添加throwing=“ex”的屬性

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

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

2.在增強(qiáng)方法中,獲取被增強(qiáng)方法的信息

Spring AOP提供org.aspectj.lang.JoinPoint類(lèi)作為增強(qiáng)方法的第一個(gè)參數(shù)。

JoinPoint :提供訪(fǎng)問(wèn)當(dāng)前被增強(qiáng)方法的真實(shí)對(duì)象、代理對(duì)象、方法參數(shù)等數(shù)據(jù)。

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

  •    jp.getThis():獲取代理對(duì)象
  •    jp.getTarget():獲取目標(biāo)對(duì)象
  •    jp.getArgs():獲取被增強(qiáng)方法的參數(shù)
  •    jp.getSignature():獲取被增強(qiáng)方法的參數(shù)

注解方式實(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("開(kāi)啟事務(wù)###");
  }
  @AfterReturning("tt()")
  public void commit() {
    System.out.println("提交事務(wù)++++++");
  }
  @AfterThrowing(value="tt()",throwing = "ex")
  public void rollback() {
    System.out.println("回滾事務(wù)....");
  }
  @After("tt()")
  public void destroy() {
    System.out.println("釋放資源……………………");
  }
  @Around("tt()")
  public Object around(ProceedingJoinPoint pjp){
    Object obj=null;
    try {
      System.out.println("開(kāi)啟事務(wù)###");
      obj=pjp.proceed();
      System.out.println("提交事務(wù)++++++");
    } catch (Throwable throwable) {
      throwable.printStackTrace();
      System.out.println("回滾事務(wù)....");
    }finally {
      System.out.println("釋放資源……………………");
    }
    return obj;
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • servlet之web路徑問(wèn)題_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    servlet之web路徑問(wèn)題_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了servlet之web路徑問(wèn)題的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java語(yǔ)言的Comparable和Comparator區(qū)別

    Java語(yǔ)言的Comparable和Comparator區(qū)別

    這篇文章主要介紹了Java語(yǔ)言的Comparable和Comparator區(qū)別,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • java easyUI實(shí)現(xiàn)自定義網(wǎng)格視圖實(shí)例代碼

    java easyUI實(shí)現(xiàn)自定義網(wǎng)格視圖實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于java easyUI實(shí)現(xiàn)自定義網(wǎng)格視圖的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • 詳解Spring Boot 配置加載順序及屬性加載順序

    詳解Spring Boot 配置加載順序及屬性加載順序

    這篇文章主要介紹了詳解Spring Boot 配置加載順序及屬性加載順序,本章內(nèi)容基于 Spring Boot 2.0 進(jìn)行詳解,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-08-08
  • MyBatis-Plus邏輯刪除和字段自動(dòng)填充的實(shí)現(xiàn)

    MyBatis-Plus邏輯刪除和字段自動(dòng)填充的實(shí)現(xiàn)

    本文主要介紹了MyBatis-Plus邏輯刪除和字段自動(dòng)填充的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Proxy實(shí)現(xiàn)AOP切面編程案例

    Proxy實(shí)現(xiàn)AOP切面編程案例

    這篇文章主要介紹了Proxy實(shí)現(xiàn)AOP切面編程案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • SpringBoot接受參數(shù)相關(guān)注解方式

    SpringBoot接受參數(shù)相關(guān)注解方式

    SpringBoot接受參數(shù)的注解包括@PathVariable、@RequestHeader、@RequestParameter、@CookieValue、@RequestBody、@RequestAttribute和@SessionAttribute等,每個(gè)注解都有詳細(xì)的使用方法和示例代碼
    2024-12-12
  • java前后端使用ajax數(shù)據(jù)交互問(wèn)題(簡(jiǎn)單demo)

    java前后端使用ajax數(shù)據(jù)交互問(wèn)題(簡(jiǎn)單demo)

    這篇文章主要介紹了java前后端使用ajax數(shù)據(jù)交互問(wèn)題(簡(jiǎn)單demo),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-06-06
  • Spring核心IoC和AOP的理解

    Spring核心IoC和AOP的理解

    本文主要介紹了Spring核心IoC和AOP的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 分析JVM的組成結(jié)構(gòu)

    分析JVM的組成結(jié)構(gòu)

    JVM(虛擬機(jī)):指以軟件的方式模擬具有完整硬件系統(tǒng)功能、運(yùn)行在一個(gè)完全隔離環(huán)境中的完整計(jì)算機(jī)系統(tǒng) ,是物理機(jī)的軟件實(shí)現(xiàn)。JVM和VMware,Virtual Box等虛擬機(jī)一樣,都是運(yùn)行在操作系統(tǒng)之上的計(jì)算機(jī)系統(tǒng)
    2021-06-06

最新評(píng)論

金坛市| 祁东县| 涿州市| 古蔺县| 天长市| 屯昌县| 都兰县| 察哈| 修水县| 南充市| 涞水县| 阿鲁科尔沁旗| 周至县| 贵德县| 葵青区| 宜兰县| 京山县| 枝江市| 临朐县| 林州市| 广丰县| 漳州市| 台州市| 繁昌县| 灵石县| 紫云| 策勒县| 习水县| 小金县| 咸丰县| 万载县| 庆安县| 读书| 伊宁县| 新田县| 上饶县| 福泉市| 乳源| 洞头县| 叶城县| 多伦县|