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

如何使用Spring AOP的通知類型及創(chuàng)建通知

 更新時(shí)間:2019年12月18日 09:19:08   作者:小魚吃貓  
這篇文章主要給大家介紹了關(guān)于如何使用Spring AOP的通知類型及創(chuàng)建通知的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring AOP具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

寫在最前端

1.SpringAOP中共有六種通知類型,只要我們自定義一個(gè)類實(shí)現(xiàn)對(duì)應(yīng)的接口,它們?nèi)际莖rg.springframework.aop包中的。

2.AOP的連接點(diǎn)可以是方法調(diào)用、方法調(diào)用本身、類初始化、對(duì)象實(shí)例化時(shí),但是SpringAOP中全是方法調(diào)用,更簡單,也最實(shí)用

通知名稱 接口
前置通知 org.springframework.aop.MethodBeforeAdvice
后置返回通知 org.springframework.aop.AfterReturningAdvice
后置通知 org.springframework.aop.AfterAdvice
環(huán)繞通知 org.springframework.aop.MethodInterceptor
異常通知 org.springframework.aop.ThrowsAdvice
引入通知 org.springframework.aop.IntroductionInterceptor

寫一個(gè)公共類,用于目標(biāo)對(duì)象

public class Person {
 private String name;
 public boolean saySomething(String something){
  System.out.println("Pereson類中說了一句:"+something);
return true;//默認(rèn)返回true
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}

一、創(chuàng)建前置通知(也就是目標(biāo)方法調(diào)用前執(zhí)行)

前置通知可以修改傳遞給方法的參數(shù),并且可以通過拋出異常來阻止方法的執(zhí)行,可以用前置通知實(shí)現(xiàn)用戶登錄的驗(yàn)證,SpringSecurity就是這么做的

1.例子:在一個(gè)方法執(zhí)行前將包含方法名稱的消息寫入到控制臺(tái)中,并且將傳入的參數(shù)修改下。(文章中寫的內(nèi)容比較小,大多數(shù)在代碼中有注釋,大家可以下載代碼查看)

/**
 * 前置通知類
 */
public class BeforeAdvice implements MethodBeforeAdvice {


 @Override
 public void before(Method method, Object[] objects, @Nullable Object o) throws Throwable {
   //第一個(gè)參數(shù)是目標(biāo)方法對(duì)象,第二個(gè)是參數(shù),第三個(gè)是做為調(diào)用目標(biāo)的object(這是personr實(shí)例)
  //打印方法名
  System.out.println("要執(zhí)行的方法是:"+method.getName());
  //修改參數(shù)為lyn4ever
  objects[0]="lyn4ever";//我們修改成為了lyn4ever,所以打印出來的就是lyn4ever,而不是zhangsan
 }


 public static void main(String[] args) {
  Person person = new Person();

  ProxyFactory pf =new ProxyFactory();
  pf.addAdvice(new BeforeAdvice());
  pf.setTarget(person);

  Person proxy = (Person) pf.getProxy();

  //我這里傳的參數(shù)是zhangsan,理論上它應(yīng)該打印出來zhangsan
  proxy.saySomething("zhangsan");
 }
}

沒毛病,本來我輸入的是zhangsan,在aop中將參數(shù)改為了lyn4ever,這樣就完美的替換了。

二、后置返回通知

是在連接點(diǎn)(方法調(diào)用)返回后執(zhí)行,這顯然不能像上邊那樣修改參數(shù),也不能修改返回值。但是可以拋出可以發(fā)送到堆棧的異常,同樣也可以調(diào)用其他方法。

/**
 * 后置返回通知
 */
public class AfterReturnAdvice implements AfterReturningAdvice {

 @Override
 public void afterReturning(@Nullable Object o, Method method, Object[] objects, @Nullable Object o1) throws Throwable {
  /*
  參數(shù)和前置通知是一樣的
  這個(gè)是在返回之后調(diào)用,因此,person中的saySomething會(huì)先打印,我們?cè)谶@里修改的參數(shù)不起作任何作用
   */

  System.out.println("調(diào)用的方法是:"+method.getName()+"這句是在saySomething之后");//這句是在saySomething之后
  objects[0]="lyn4ever";//這句可以修參數(shù),但是之前的方法已經(jīng)執(zhí)行過了,所以不起任何作用

  System.out.println("我們修改了參數(shù)為:"+objects[0]+"但是沒有任何用");//這時(shí)候這個(gè)參數(shù)并不會(huì)傳到person.saysomething(),因?yàn)橐呀?jīng)調(diào)用過了

 }


 public static void main(String[] args) {
  Person person = new Person();

  ProxyFactory pf = new ProxyFactory();
  pf.addAdvice(new AfterReturnAdvice());//注意修改這個(gè)為當(dāng)前類中的通知類
  pf.setTarget(person);

  Person proxy = (Person) pf.getProxy();
  proxy.saySomething("zhangsan");
 }
}

三、環(huán)繞通知

這人最好理解了,就是在方法調(diào)用前后都可以執(zhí)行代碼??雌饋硐袷乔爸煤蠛笾玫募?,但是它可以修改方法的返回值,因?yàn)樗鼘?shí)現(xiàn)的invoke方法的返回值是Object,所以我們就可以修改,而前置通知的返回是void,所以沒法修改的。甚至以至于我們可以不調(diào)用目標(biāo)對(duì)象中的連接點(diǎn)方法,我們完全修改這個(gè)方法的全部代碼。

public class MyMethodInterceptor implements MethodInterceptor {
 @Override
 public Object invoke(MethodInvocation invocation) throws Throwable {
  return null;
 }
}

雖然這個(gè)invoke()方法中并沒有提供像之前的那些參數(shù),但是這一個(gè)invocation實(shí)例可以得到



代碼示例

/**
 * 環(huán)繞通知
 */
public class MyMethodInterceptor implements MethodInterceptor {
 @Override
 public Object invoke(MethodInvocation invocation) throws Throwable {
  
  //在這個(gè)invoation中有一切我們想要的方法相關(guān)
  System.out.println("類名是:"+invocation.getThis().getClass().getName());
  System.out.println("目標(biāo)方法是:"+invocation.getMethod().getName());

  Object[] arguments = invocation.getArguments();//這個(gè)就是參數(shù)
  System.out.println("第一個(gè)參數(shù) 是:"+arguments[0]);

  //我們修改第一個(gè)參數(shù)為lyn4ever
  arguments[0]="lyn4ever";


  invocation.proceed();//執(zhí)行目標(biāo)方法


  System.out.println("這個(gè)是在之后執(zhí)行的");

  return false;//修改返回值
 }


 public static void main(String[] args) {
  Person person = new Person();

  ProxyFactory pf = new ProxyFactory();
  pf.addAdvice(new MyMethodInterceptor());//注意修改這個(gè)為當(dāng)前類中的通知類
  pf.setTarget(person);

  Person proxy = (Person) pf.getProxy();
  boolean flag = proxy.saySomething("zhangsan");
  System.out.println(flag);//方法本來是要返回true的
 }
}

可以看到,我們修改了目標(biāo)方法返回的值。

本文demo已提交至github

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Java實(shí)現(xiàn)簡單碰撞檢測(cè)

    Java實(shí)現(xiàn)簡單碰撞檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單碰撞檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • MyBatisPlus的IService接口實(shí)現(xiàn)

    MyBatisPlus的IService接口實(shí)現(xiàn)

    MyBatisPlus是一個(gè)為MyBatis提供增強(qiáng)的工具,它通過IService接口簡化了數(shù)據(jù)庫的CRUD操作,IService接口封裝了一系列常用的數(shù)據(jù)操作方法,本文就來介紹一下,感興趣的可以了解一下
    2024-10-10
  • Java中圖像銳化操作的方法詳解

    Java中圖像銳化操作的方法詳解

    這篇文章主要給大家介紹了關(guān)于Java中圖像銳化操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • springboot prototype設(shè)置多例不起作用的解決操作

    springboot prototype設(shè)置多例不起作用的解決操作

    這篇文章主要介紹了springboot prototype設(shè)置多例不起作用的解決操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java中的@PostConstruct注解

    Java中的@PostConstruct注解

    本文給大家介紹Java中的@PostConstruct注解的相關(guān)知識(shí),通過示例代碼給大家補(bǔ)充介紹了Java提供的@PostConstruct注解,Spring是如何實(shí)現(xiàn)的,感興趣的朋友一起看看吧
    2025-04-04
  • Spring中的@AutoWired與@Resource及@Qualifier注解詳解

    Spring中的@AutoWired與@Resource及@Qualifier注解詳解

    這篇文章主要介紹了Spring中的@AutoWired與@Resource及@Qualifier注解詳解,spring不但支持自己定義的@Autowired注解,所以Autowired與Spring是強(qiáng)相關(guān)性,只能在spring框架中使用,而后幾個(gè)注解則不然,需要的朋友可以參考下
    2023-11-11
  • 聊聊Spring循環(huán)依賴三級(jí)緩存是否可以減少為二級(jí)緩存的情況

    聊聊Spring循環(huán)依賴三級(jí)緩存是否可以減少為二級(jí)緩存的情況

    這篇文章主要介紹了聊聊Spring循環(huán)依賴三級(jí)緩存是否可以減少為二級(jí)緩存的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java實(shí)現(xiàn)上傳網(wǎng)絡(luò)圖片到微信臨時(shí)素材

    java實(shí)現(xiàn)上傳網(wǎng)絡(luò)圖片到微信臨時(shí)素材

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)上傳網(wǎng)絡(luò)圖片到微信臨時(shí)素材,網(wǎng)絡(luò)圖片上傳到微信服務(wù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • java發(fā)送kafka事務(wù)消息的實(shí)現(xiàn)方法

    java發(fā)送kafka事務(wù)消息的實(shí)現(xiàn)方法

    本文主要介紹了java發(fā)送kafka事務(wù)消息的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Hadoop之Mapreduce序列化

    Hadoop之Mapreduce序列化

    本文主要帶我們了解Mapreduce序列化,序列化就是把內(nèi)存中的對(duì)象,轉(zhuǎn)換成字節(jié)序列(或其他數(shù)據(jù)傳輸協(xié)議)以便于存儲(chǔ)到磁盤(持久化)和網(wǎng)絡(luò)傳輸。想進(jìn)一步了解更多的小伙伴,可以參考閱讀本文
    2023-03-03

最新評(píng)論

苏尼特右旗| 密山市| 松原市| 威远县| 灌云县| 崇州市| 汕尾市| 察雅县| 鲁甸县| 策勒县| 广丰县| 朔州市| 拉孜县| 华容县| 华安县| 阿巴嘎旗| 汉沽区| 保山市| 泌阳县| 高碑店市| 台北县| 龙南县| 苗栗市| 荔波县| 乌拉特后旗| 陵水| 通海县| 潍坊市| 赣州市| 泾川县| 浦东新区| 静宁县| 吉安市| 新龙县| 白沙| 永春县| 阳朔县| 福安市| 安仁县| 南郑县| 广西|