English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
إطار Springنوصي باستخدام تنفيذ AOP القديم القائم على دtd 1.2 لـ Spring: تنفيذ Spring AspectJ AOPسهل الاستخدام.
هناك طريقتان لاستخدام تنفيذ Spring AOP AspectJ:
من خلال التعليقات: سنتعلم عنها هنا. من خلال تكوين xml (قائم على النمط): سنتعلم عنه في الصفحة التالية.
يقدم تنفيذ Spring AspectJ AOP العديد من التعليقات:
@Aspect تعلن هذا الكائن كجهة. @Pointcut إعلان تعبير النقطة.
تعليقات تستخدم لإنشاء التوجيهات كالتالي:
@Before إعلان التوجيه قبل التشغيل. يتم تطبيقه قبل استدعاء الطريقة الفعلية. @After إعلان التوجيه بعد التشغيل. يتم تطبيقه بعد استدعاء الطريقة الفعلية وبق قبل العودة إلى النتيجة. @AfterReturning إعلان التوجيه بعد العودة. يتم تطبيقه بعد استدعاء الطريقة الفعلية وبق قبل العودة إلى النتيجة. ولكن يمكنك الحصول على قيمة النتيجة في التوجيه. @Around إعلان التوجيه حول التشغيل. يتم تطبيقه قبل وتحديده بعد استدعاء الطريقة الفعلية. @AfterThrowing Declared throws advice. If the actual method throws an exception, this method is applied.
Pointcut is a declarative language in Spring AOP.
@Pointcut > Comments are used to define pointcut expressions. We can also refer to pointcut expressions by name. Let's see a simple example of a pointcut expression.
@Pointcut("execution(* Operation.*(..))") private void doSomething() {}
The name of the pointcut expression is doSomething(). It will be applied to all methods of the Operation class regardless of the return type.
Let's try to understand the pointcut expression through the following example:
@Pointcut("execution(public * *(..))")
It will be applied to all public methods.
@Pointcut("execution(public Operation.*(..))")
It will be applied to all public methods of the Operation class.
@Pointcut("execution(* Operation.*(..))")
It will be applied to all methods of the Operation class.
@Pointcut("execution(public Employee.set*(..))")
It will be applied to all public setter methods of the Employee class.
@Pointcut("execution(int Operation.*(..))")
It will be applied to all methods of the Operation class that return int values.
Apply AspectJ Before Advice before the actual business logic method. You can perform any operation here, such as transformation, authentication, etc.
إنشاء فئة تحتوي على منطق الأعمال الفعلية.
ملف: Operation.java
package com.w3codebox; public class Operation{ public void msg(){System.out.println("msg method invoked");} public int m(){System.out.println("m method invoked");return 2;} public int k(){System.out.println("k method invoked");return 3;} }
Now, create an aspect class that contains the advice before.
ملف: TrackOperation.java
package com.w3codebox; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; استيراد org.aspectj.lang.annotation.Pointcut; @Aspect public class TrackOperation{ @Pointcut("execution(* Operation.*(..))") public void k(){}//اسم pointcut @Before("k()")//apply the pointcut on before notification public void myadvice(JoinPoint jp)//it is advice (before advice) { System.out.println("اهتمام إضافي"); //System.out.println("Method Signature: " + jp.getSignature()); } }
الآن أنشئ ملف applicationContext.xml الذي يحتوي على تعريف bean.
ملف: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 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"> <bean id="opBean" class="com.w3codebox.Operation"> </bean> <bean id="trackMyBean" class="com.w3codebox.TrackOperation"></bean> <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"></bean> </beans>
الآن، دعونا نسمي هذه الطريقة الفعلية.
ملف: Test.java
package com.w3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Operation e = (Operation) context.getBean("opBean"); System.out.println("calling msg..."); e.msg(); System.out.println("استدعاء m..."); e.m(); System.out.println("استدعاء k..."); e.k(); } }
الإخراج
استدعاء msg... اهتمام إضافي تم استدعاء msg() method استدعاء m... اهتمام إضافي تم استدعاء m() method استدعاء k... اهتمام إضافي تم استدعاء k() method
كما ترون، قبل إدخال msg()، m() و k()، سيتم عرض مشاكل أخرى.
الآن، إذا قمت بتغيير تعبير النقطة العكسية كما يلي:
@Pointcut("execution(* Operation.m*(..))")
الآن، سيتم التركيز أكثر على الطرق التي تبدأ بحرف m في فئة Operation. سيكون الخروج كما يلي:
استدعاء msg... اهتمام إضافي تم استدعاء msg() method استدعاء m... اهتمام إضافي تم استدعاء m() method استدعاء k... تم استدعاء k() method
الآن يمكنك رؤية أن لم يتم طباعة أي مشاكل أخرى قبل استدعاء method k().
بعد استدعاء لógica العمل الفعلية، يتم تطبيق AspectJ بعد النصيحة. يمكن استخدامها للحفاظ على السجلات، الأمان، الإشعارات وغيرها.
في هذا السياق، نفترض Operation.java ، applicationContext.xml و Test.java الملف هو نفسه الذي تم ذكره في مثال @Before.
package com.w3codebox; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.After; استيراد org.aspectj.lang.annotation.Pointcut; @Aspect public class TrackOperation{ @Pointcut("execution(* Operation.*(..))") public void k(){}//اسم pointcut @After("k()")//تطبيق pointcut على نصيحة بعد النصيحة public void myadvice(JoinPoint jp)//هذا نصيحة بعد النصيحة) { System.out.println("اهتمام إضافي"); //System.out.println("Method Signature: " + jp.getSignature()); } }
الإخراج
استدعاء msg... تم استدعاء msg() method اهتمام إضافي استدعاء m... تم استدعاء m() method اهتمام إضافي استدعاء k... تم استدعاء k() method اهتمام إضافي
يمكنك رؤية أن هناك مشاكل أخرى بعد استدعاء msg()، m() و k() methods.
من خلال استخدامها بعد إرجاع النصيحة، يمكننا الحصول على النتيجة في النصيحة.
إنشاء فئة تحتوي على لógica العمل.
ملف: Operation.java
package com.w3codebox; public class Operation{ public int m(){System.out.println("تم استدعاء m() method");return 2;} public int k(){System.out.println("تم استدعاء k() method");return 3;} }
إنشاء فئة الجانب التي تحتوي على النصيحة بعد إرجاع النصيحة.
ملف: TrackOperation.java
package com.w3codebox; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; @Aspect public class TrackOperation{ @AfterReturning( pointcut = "execution(* Operation.*(..))", returning= "result") public void myadvice(JoinPoint jp, Object result)//هذا نصيحة بعد إرجاع النصيحة) { System.out.println("اهتمام إضافي"); System.out.println("توقيع الطريقة: " + jp.getSignature()); System.out.println("نتيجة النصيحة: " + result); System.out.println("نهاية بعد إرجاع النصيحة..."); } }
ملف: applicationContext.xml
مثل مثال @Before المقدم
ملف: Test.java
الآن قم بإنشاء فئة Test لتشغيل الواقعية.
package com.w3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Operation e = (Operation) context.getBean("opBean"); System.out.println("استدعاء m..."); System.out.println(e.m()); System.out.println("استدعاء k..."); System.out.println(e.k()); } }
الإخراج
استدعاء m... تم استدعاء m() method اهتمام إضافي إشارة إلى الطريقة: int com.w3codebox.Operation.m() نتيجة النصيحة: 2 نهاية نصيحة after returning... 2 استدعاء k... تم استدعاء k() method اهتمام إضافي إشارة إلى الطريقة: int com.w3codebox.Operation.k() نتيجة النصيحة: 3 نهاية نصيحة after returning... 3
يمكنك رؤية أن القيمة المعدة تم طباعتها مرتين، مرة واحدة من قبل فئة TrackOperation، ومرة أخرى من قبل فئة Test.
يتم تطبيق AspectJ المحيط بالنشرة قبل وبعد تنفيذ منطق الأعمال الفعلية.
في هذا السياق، نحن نفترض applicationContext.xml الملف هو نفسه الذي تم ذكره في مثال @Before.
إنشاء فئة تحتوي على منطق الأعمال الفعلية.
ملف: Operation.java
package com.w3codebox; public class Operation{ public void msg(){System.out.println("msg() is invoked");} public void display(){System.out.println("display() is invoked");} }
إنشاء فئة تحتوي على الجانب المحيط بالتعليمات.
يجب عليك نقلها إلى دالة advice. PreceedingJoinPoint الإشارة إليها، حتى نتمكن من تنفيذ طلب() من خلال دعوة proce.
ملف: TrackOperation.java
package com.w3codebox; استيراد org.aspectj.lang.ProceedingJoinPoint; استيراد org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; استيراد org.aspectj.lang.annotation.Pointcut; @Aspect public class TrackOperation { @Pointcut("execution(* Operation.*(..))") public void abcPointcut(){} @Around("abcPointcut()") public Object myadvice(ProceedingJoinPoint pjp) throws Throwable { System.out.println("الاهتمام الإضافي قبل إجراء الطريقة الفعلية"); Object obj=pjp.proceed(); System.out.println("الاهتمام الإضافي بعد إجراء الطريقة الفعلية"); return obj; } }
ملف: Test.java
الآن قم بإنشاء فئة Test لتشغيل الواقعية.
package com.w3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new classPathXmlApplicationContext("applicationContext.xml"); Operation op = (Operation) context.getBean("opBean"); op.msg(); op.display(); } }
الإخراج
الاهتمام الإضافي قبل إجراء الطريقة الفعلية إجراء msg() الاهتمام الإضافي بعد إجراء الطريقة الفعلية الاهتمام الإضافي قبل إجراء الطريقة الفعلية إجراء display() الاهتمام الإضافي بعد إجراء الطريقة الفعلية
يمكنك رؤية أن هناك أيضًا طباعة لأسئلة أخرى قبل وتحت إجراء msg() وعرض الطريقة.
باستخدام نصيحة after throw، يمكننا طباعة الاستثناء في فئة TrackOperation. دعنا نرى مثال نصيحة AspectJ AfterThrowing.
إنشاء فئة تحتوي على منطق الأعمال.
ملف: Operation.java
package com.w3codebox; public class Operation{ public void validate(int age) throws Exception{ if(age<18){ throw new ArithmeticException("العمر غير صالح"); } else{ System.out.println("شكراً على التصويت"); } } }
إنشاء فئة جانبية تحتوي على aspect بعد إلقاء النصيحة.
في هذا السياق، نحتاج أيضًا إلى نقل استدلال Throwable حتى نتمكن من توقيف الاستثناء هنا.
ملف: TrackOperation.java
package com.w3codebox; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; @Aspect public class TrackOperation{ @AfterThrowing( pointcut = "execution(* Operation.*(..))", throwing = "error") public void myadvice(JoinPoint jp, Throwable error)//it is advice { System.out.println("اهتمام إضافي"); System.out.println("توقيع الطريقة: " + jp.getSignature()); System.out.println("الاستثناء هو: " + error); System.out.println("نهاية after throwing advice..."); } }
ملف: applicationContext.xml
مثل مثال @Before المقدم
ملف: Test.java
الآن قم بإنشاء فئة Test لتشغيل الواقعية.
package com.w3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Operation op = (Operation) context.getBean("opBean"); System.out.println("ندعو validate..."); try{ op.validate(19); }catch(Exception e){System.out.println(e);} System.out.println("ندعو مرة أخرى validate..."); try{ op.validate(11); }catch(Exception e){System.out.println(e);} } }
الإخراج
ندعو validate... شكراً على التصويت ندعو مرة أخرى validate... اهتمام إضافي توقيع الطريقة: void com.w3codebox.Operation.validate(int) استثنائية هي: java.lang.ArithmeticException: غير صالح العمر نهاية after throwing advice... java.lang.ArithmeticException: غير صالح العمر