1. 程式人生 > >SpringAop中JoinPoint物件的使用方法

SpringAop中JoinPoint物件的使用方法

JoinPoint的用法

JoinPoint 物件

JoinPoint物件封裝了SpringAop中切面方法的資訊,在切面方法中新增JoinPoint引數,就可以獲取到封裝了該方法資訊的JoinPoint物件.
常用api:

方法名 功能
Signature getSignature(); 獲取封裝了署名資訊的物件,在該物件中可以獲取到目標方法名,所屬類的Class等資訊
Object[] getArgs(); 獲取傳入目標方法的引數物件
Object getTarget(); 獲取被代理的物件
Object getThis(); 獲取代理物件

ProceedingJoinPoint物件

ProceedingJoinPoint物件是JoinPoint的子介面,該物件只用在@Around的切面方法中,
添加了
Object proceed() throws Throwable //執行目標方法
Object proceed(Object[] var1) throws Throwable //傳入的新的引數去執行目標方法
兩個方法.

Demo

切面類

@Aspect
@Component
public class aopAspect {
    /**
     * 定義一個切入點表示式,用來確定哪些類需要代理
     * execution(* aopdemo.*.*(..))代表aopdemo包下所有類的所有方法都會被代理
     */
@Pointcut("execution(* aopdemo.*.*(..))") public void declareJoinPointerExpression() {} /** * 前置方法,在目標方法執行前執行 * @param joinPoint 封裝了代理方法資訊的物件,若用不到則可以忽略不寫 */ @Before("declareJoinPointerExpression()") public void beforeMethod(JoinPoint joinPoint){ System.out.println("目標方法名為:"
+ joinPoint.getSignature().getName()); System.out.println("目標方法所屬類的簡單類名:" + joinPoint.getSignature().getDeclaringType().getSimpleName()); System.out.println("目標方法所屬類的類名:" + joinPoint.getSignature().getDeclaringTypeName()); System.out.println("目標方法宣告型別:" + Modifier.toString(joinPoint.getSignature().getModifiers())); //獲取傳入目標方法的引數 Object[] args = joinPoint.getArgs(); for (int i = 0; i < args.length; i++) { System.out.println("第" + (i+1) + "個引數為:" + args[i]); } System.out.println("被代理的物件:" + joinPoint.getTarget()); System.out.println("代理物件自己:" + joinPoint.getThis()); } /** * 環繞方法,可自定義目標方法執行的時機 * @param pjd JoinPoint的子介面,添加了 * Object proceed() throws Throwable 執行目標方法 * Object proceed(Object[] var1) throws Throwable 傳入的新的引數去執行目標方法 * 兩個方法 * @return 此方法需要返回值,返回值視為目標方法的返回值 */ @Around("declareJoinPointerExpression()") public Object aroundMethod(ProceedingJoinPoint pjd){ Object result = null; try { //前置通知 System.out.println("目標方法執行前..."); //執行目標方法 //result = pjd.proeed(); //用新的引數值執行目標方法 result = pjd.proceed(new Object[]{"newSpring","newAop"}); //返回通知 System.out.println("目標方法返回結果後..."); } catch (Throwable e) { //異常通知 System.out.println("執行目標方法異常後..."); throw new RuntimeException(e); } //後置通知 System.out.println("目標方法執行後..."); return result; } }

被代理類

/**
 * 被代理物件
 */
@Component
public class TargetClass {
    /**
     * 拼接兩個字串
     */
    public String joint(String str1, String str2) {
        return str1 + "+" + str2;
    }
}

測試類

public class TestAop {
    @Test
    public void testAOP() {
        //1、建立Spring的IOC的容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:bean.xml");

        //2、從IOC容器中獲取bean的例項
        TargetClass targetClass = (TargetClass) ctx.getBean("targetClass");

        //3、使用bean
        String result = targetClass.joint("spring","aop");
        System.out.println("result:" + result);
    }
}

輸出結果

目標方法執行前...
目標方法名為:joint
目標方法所屬類的簡單類名:TargetClass
目標方法所屬類的類名:aopdemo.TargetClass
目標方法宣告型別:public
第1個引數為:newSpring
第2個引數為:newAop
被代理的物件:[email protected]
代理物件自己:[email protected]
目標方法返回結果後...
目標方法執行後...
result:newSpring+newAop

相關推薦

SpringAopJoinPoint物件的使用方法

JoinPoint的用法 JoinPoint 物件 JoinPoint物件封裝了SpringAop中切面方法的資訊,在切面方法中新增JoinPoint引數,就可以獲取到封裝了該方法資訊的JoinPoint物件. 常用api: 方法名

day03-easyUImessager物件方法及menubutton選單使用

messager物件方法使用         alert方法---提示框       (info預設是英文,如果需要是中文,需要引入: <script type=

SpringAOP如何獲取方法的引數值(實體類)以及引數名

 廢話不多說直接上程式碼 引數對了效果就可以出來  返回值是一個map key 是引數名稱 value 是引數值, private static Map getFieldsName(Proceedi

SpringAOPjoinpoint物件 target和this方法的區別

情景如下:建立一個持久層的類gooddaoimpl用切面類 goodaspect進行功能增強--------------------------------------------------------------------------------------------

List去重(資料為物件的情況)及String的equals()方法和hashCode()方法原始碼分析

面試中經常被問到的list如何去重,用來考察你對list資料結構,以及相關方法的掌握,體現你的java基礎學的是否牢固。 我們大家都知道,set集合的特點就是沒有重複的元素。如果集合中的資料型別是基本資料型別,可以直接將list集合轉換成set,就會自動去除重複的元素,這個就相對比較簡單。上一篇

為什麼通用的物件方法要加在原型

在建構函式中加屬性,原型中加方法。我學面向物件時一直記著的一句話,但為什麼方法要加在原型呢,今天再次看望遠鏡書時終於明白了。 將屬性和方法都寫在建構函式中沒問題,但問題在於每次進行例項化的過程中,重複建立功能不變的方法。 由於方法本質上是函式,其實也就是在堆記憶體中又新建了一個物件空間儲

PHP的面向物件OOP的魔術方法

一、什麼是魔術方法: PHP為我們提供了一系列用__開頭的函式,這些函式無需自己手動呼叫,會在合適的時機自動呼叫,這類函式稱為魔術函式。 例如: function __construct(){} 在new一個新物件時自動呼叫此函式 二、PHP中都有那些魔術方法,以及它們的作用:

javascript物件轉陣列的方法

1. 物件沒有length屬性 2.Array.prototype.slice.call(obj)能將具有length屬性的物件轉成陣列,不帶length屬性的物件,只能宣告陣列去轉換 <!DOCTYPE html> <html lang

jsObject物件常用方法和屬性

1、屬性 Object.prototype.writable:預設為false Object.prototype.enumerable:預設為false Object.prototype.configurable:預設為false Object.prototype.constructor:用

JSString物件的常用方法

1、charCodeAt方法返回一個整數,代表指定位置字元的Unicode編碼。 strObj.charCodeAt(index) 說明: index將被處理字元的從零開始計數的編號。有效值為0到字串長度減1的數字。 如果指定位置沒有字元,將返回NaN。 例如: var str = “ABC

DjangoQuerySet物件(模型.objects)的常用方法

準備工作: 新建一個專案,在專案中新家一個app,名字自取。將app新增值settings.py中,然後配置settings連線資料庫。 在app中的models中新建模型: from django.db import models # Create your models h

JSString物件常用方法

1.chatAt():返回在指定位置的字元 用法:str.charAt(index) str為字串、index為索引 2.charCodeAt():返回在指定位置的字元的Unicode編碼 用法:str.charCodeAt(index):str為字串、index為索引 3.conc

在Java建立物件的不同方法是什麼?

在這篇快速文章中,我們將討論在Java中建立物件的五種不同方法。我們知道,類是建立物件的模板或藍圖。讓我們列出在Java中建立物件的不同方法。 用Java建立物件的5種不同方法 1.使用新關鍵字 2.使用  newInstance() Class類的方法 3.使用&n

python面向物件物件、例項物件、類變數、例項變數、類方法、例項方法、靜態方法

  1. 類物件和例項物件   Python中一切皆物件,Python類本身也是一種物件,類定義完成後,會在當前作用域中定義一個以類名為名字的名稱空間。類物件具有以下兩種操作: 可以通過“類名()”的方式例項化一個物件。  可以通過“類名.類屬性”的方式來訪問一個類屬性。

靜態方法呼叫service方法,以及獲取request物件

靜態方法中呼叫service方法,以及獲取request物件 //普通service方法,重點:ApplicationContextRegister物件 DictionaryService dictionaryService = ApplicationContextRe

面向物件方法的資料庫設計

   在面向物件中,是沒有資料流這一說法的。業務的完成是由物件及訊息來完成的,只有“物件流”,沒有資料流。         只是在現實中,絕大部分的物件持久化是用關係資料庫實現的,我麼還沒有在效能上和查詢上

js Date物件方法詳解

          var myDate = new Date();        myDate.getFullYear()  //獲取完整

java方法物件方法區別

public class Test { /** * 下面這個方法就是靜態方法,應該就是樓主所說的類方法~~ * 靜態方法必須定義成static的,在類Test被例項化以前就已經存在於記憶體中 * 靜態方法使所有該類的例項也就是物件共有的方法 */ public static void f1() {

總結Python面向物件的特殊方法

當你從萌新小白到有點程式設計概念的時候或許就會有疑問,為什麼print()就可以打印出東西,為什麼生成器就可以next()進行迭代,這些都是因為類本身實現了一些特殊方法,我們來總結一下: 1.如果把一個類的例項變成str,就需要實現特殊方法__str__( ): str:用於顯示給使用者 r

javasynchronized 用在例項方法物件方法上面的區別

https://bijian1013.iteye.com/blog/1836575    在Java中,synchronized 是用來表示同步的,我們可以synchronized 來修飾一個方法。也可以synchronized 來修飾方法裡面的一個語句塊。