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
相關推薦
SpringAop中JoinPoint物件的使用方法
JoinPoint的用法 JoinPoint 物件 JoinPoint物件封裝了SpringAop中切面方法的資訊,在切面方法中新增JoinPoint引數,就可以獲取到封裝了該方法資訊的JoinPoint物件. 常用api: 方法名
day03-easyUI中messager物件方法及menubutton選單使用
messager物件方法使用 alert方法---提示框 (info預設是英文,如果需要是中文,需要引入: <script type=
在SpringAOP中如何獲取方法的引數值(實體類)以及引數名
廢話不多說直接上程式碼 引數對了效果就可以出來 返回值是一個map key 是引數名稱 value 是引數值, private static Map getFieldsName(Proceedi
SpringAOP中的joinpoint物件 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
js中Object物件常用方法和屬性
1、屬性 Object.prototype.writable:預設為false Object.prototype.enumerable:預設為false Object.prototype.configurable:預設為false Object.prototype.constructor:用
JS中String物件的常用方法
1、charCodeAt方法返回一個整數,代表指定位置字元的Unicode編碼。 strObj.charCodeAt(index) 說明: index將被處理字元的從零開始計數的編號。有效值為0到字串長度減1的數字。 如果指定位置沒有字元,將返回NaN。 例如: var str = “ABC
Django中QuerySet物件(模型.objects)的常用方法
準備工作: 新建一個專案,在專案中新家一個app,名字自取。將app新增值settings.py中,然後配置settings連線資料庫。 在app中的models中新建模型: from django.db import models # Create your models h
JS中String物件常用方法
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
java中synchronized 用在例項方法和物件方法上面的區別
https://bijian1013.iteye.com/blog/1836575 在Java中,synchronized 是用來表示同步的,我們可以synchronized 來修飾一個方法。也可以synchronized 來修飾方法裡面的一個語句塊。