English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

مثال تكوين Xml لـ Spring AOP AspectJ

يمنحك Spring القدرة على تعريف الجوانب، النصائح، والنقاط الداخلية في ملف xml.

في الصفحة السابقة، رأينا مثال aop باستخدام التعليقات. الآن، سنرى نفس المثال من خلال ملف تكوين xml.

دعونا نرى العناصر xml المستخدمة لتعريف النصيحة.

aop: قبل تطبيقها قبل استدعاء لógica العمل الفعلية الفعلية. aop: بعد تطبيقها بعد استدعاء لógica العمل الفعلية الفعلية. aop: بعد العودةتطبيقها بعد استدعاء لógica العمل الفعلية الفعلية. يمكن استخدامها لمنع قيمة العودة في الإشعارات. aop: حول تطبيقها قبل وبعد استدعاء لógica العمل الفعلية الفعلية. aop: بعد رميتطبيقها إذا ألقت لógica العمل الفعلية استثناء.
ملاحظة: للتعرف على مفهوم aop وأفضليته وما إلى ذلك، يرجى زيارة هنا. دروس مفهوم aop

1، aop: قبل

تطبيق "إرشادات AspectJ المسبقة" قبل لógica العمل الفعلية. يمكنك القيام بأي عملية هنا، مثل التحويل، التحقق من الهوية، وما إلى ذلك.

إنشاء فئة تحتوي على لógica العمل الفعلية.

ملف: Operation.java
package\x20com.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;}
}

الآن، قم بإنشاء فئة الجانب التي تحتوي على الإشعار قبل.

ملف: TrackOperation.java

package\x20com.w3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp)//it is 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-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd\x20
<aop:aspectj-autoproxy\/>
<bean\x20id="opBean"\x20class="com.w3codebox.Operation">\x20</bean>
<bean\x20id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect\x20id="myaspect"\x20ref="trackAspect"\x20>
     <!-- @Before -->
     <aop:pointcut\x20id="pointCutBefore"	expression="execution(*\x20com.w3codebox.Operation.*(..))"\/>
     <aop:before method="myadvice" pointcut-ref="pointCutBefore" />
  </aop:aspect>
</aop:config>
</beans>

الآن، دعونا ندعوها方法是 الفعلية.

ملف:\x20Test.java

package\x20com.w3codebox;
import\x20org.springframework.context.ApplicationContext;
import\x20org.springframework.context.support.ClassPathXmlApplicationContext;
public\x20class\x20Test\{
	public\x20static\x20void\x20main(String\[\]\x20args)\{
		ApplicationContext\x20context\x20=\x20new\x20ClassPathXmlApplicationContext("applicationContext.xml");
		Operation e = (Operation) context.getBean("opBean");
		System.out.println("استدعاء msg...");
		e.msg();
		System.out.println("استدعاء m...");
		e.m();
		System.out.println("استدعاء k...");
		e.k();
	}
}

الإخراج

استدعاء msg...
اهتمام إضافي
msg() method invoked
استدعاء m...
اهتمام إضافي
تم استدعاء الطريقة m()
استدعاء k...
اهتمام إضافي
تم استدعاء الطريقة k()

كما ترون، قبل استدعاء msg()، m() و k() methods، يتم طباعة مشاكل أخرى.


2- مثال بعد AOP:

بعد استدعاء منطق الأعمال الفعلية، يتم تطبيق AspectJ بعد الإشعارات. يمكن استخدامها للحفاظ على السجلات، الأمان، الإشعارات، إلخ.

في هذا المكان، نضمن Operation.java ، TrackOperation.java و Test.java يكون الملف مشابهًا لـ aop: مثال.

الآن قم بإنشاء ملف 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-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd\x20
<aop:aspectj-autoproxy\/>
<bean\x20id="opBean"\x20class="com.w3codebox.Operation">\x20</bean>
<bean\x20id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect\x20id="myaspect"\x20ref="trackAspect"\x20>
     <!-- @After -->
     <aop:pointcut\x20id="pointCutAfter"	expression="execution(*\x20com.w3codebox.Operation.*(..))"\/>
     <aop:after method="myadvice" pointcut-ref="pointCutAfter" />
  </aop:aspect>
</aop:config>
</beans>

الإخراج

استدعاء msg...
msg() method invoked
اهتمام إضافي
استدعاء m...
تم استدعاء الطريقة m()
اهتمام إضافي
استدعاء k...
تم استدعاء الطريقة k()
اهتمام إضافي

يمكنك رؤية أن هناك مشاكل أخرى بعد استدعاء msg()، m() و k() methods.


3- مثال بعد AOP: العودة

باستخدامها بعد تقديم الإقتراح، يمكننا الحصول على النتيجة في الإقتراح.

إنشاء

ملف: Operation.java

package\x20com.w3codebox;
public  class Operation{
	public int m(){System.out.println("m() method invoked");return 2;}
	public int k(){System.out.println("k() method invoked");return 3;}
}

إنشاء فئة الجانب التي تحتوي على نصيحة العودة.

ملف: TrackOperation.java

package\x20com.w3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp,Object result)//it is advice (after advice)
	{
		System.out.println("اهتمام إضافي");
		System.out.println("توقيع الطريقة: "+jp.getSignature());
		System.out.println("نتيجة النصيحة: "+result);
		System.out.println("نهاية نصيحة بعد العودة...");
	}
}

ملف: 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-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd\x20
<aop:aspectj-autoproxy\/>
<bean\x20id="opBean"\x20class="com.w3codebox.Operation">\x20</bean>
<bean\x20id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect\x20id="myaspect"\x20ref="trackAspect"\x20>
     <!-- @AfterReturning -->
     <aop:pointcut\x20id="pointCutAfterReturning"	expression="execution(*\x20com.w3codebox.Operation.*(..))"\/>
     <aop:after-returning method="myadvice" returning="result" pointcut-ref="pointCutAfterReturning" />
  </aop:aspect>
</aop:config>
</beans>

ملف:\x20Test.java

الآن\x20يتم\x20إنشاء\x20فئة\x20Test\x20للتعامل\x20مع\x20الطريقة\x20الحقيقية.

package\x20com.w3codebox;
import\x20org.springframework.context.ApplicationContext;
import\x20org.springframework.context.support.ClassPathXmlApplicationContext;
public\x20class\x20Test\{
	public\x20static\x20void\x20main(String\[\]\x20args)\{
		ApplicationContext\x20context\x20=\x20new\x20ClassPathXmlApplicationContext("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()
اهتمام إضافي
توقيع الطريقة: int com.w3codebox.Operation.m()
نتيجة النصيحة: 2
نهاية نصيحة بعد العودة...
2
استدعاء k...
تم استدعاء الطريقة k()
اهتمام إضافي
توقيع الطريقة: int com.w3codebox.Operation.k()
نتيجة النصيحة: 3
نهاية نصيحة بعد العودة...
3

يمكنك رؤية أن القيمة المُرجعة تم طباعتها مرتين، مرة واحدة بواسطة فئة TrackOperation، ومرة أخرى بواسطة فئة Test.


4- حول aop:

يُنصح ب تطبيق AspectJ قبل وبعد استدعاء واجهة برمجة التطبيقات الحقيقية.

إنشاء فئة

ملف: Operation.java

package\x20com.w3codebox;
public  class Operation{
	public void msg(){System.out.println("msg() is invoked");}
	public void display(){System.out.println("يُدعى display()");}
}

إنشاء فئة الجانب التي تحتوي على نصيحة الدائرة.

يجب عليك نقلها إلى طريقة النصيحة PreceedingJoinPoint الاستدلال، حتى نتمكن من إجراء الطلب() من خلال استدعاء proceed.

ملف: TrackOperation.java

package\x20com.w3codebox;
import org.aspectj.lang.ProceedingJoinPoint;
public class TrackOperation
{
	public Object myadvice(ProceedingJoinPoint pjp) throws Throwable 
	{
		System.out.println("مشكلة إضافية قبل إجراء الطريقة الفعلية");
		Object obj = pjp.proceed();
		System.out.println("مشكلة إضافية بعد إجراء الطريقة الفعلية");
		return obj;
	}
}

ملف: 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-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd\x20
<aop:aspectj-autoproxy\/>
<bean\x20id="opBean"\x20class="com.w3codebox.Operation">\x20</bean>
<bean\x20id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect\x20id="myaspect"\x20ref="trackAspect"\x20>
     <!-- @Around -->
     <aop:pointcut\x20id="pointCutAround"	expression="execution(*\x20com.w3codebox.Operation.*(..))"\/>
     <aop:around method="myadvice" pointcut-ref="pointCutAround" />
  </aop:aspect>
</aop:config>
</beans>

ملف:\x20Test.java

الآن\x20يتم\x20إنشاء\x20فئة\x20Test\x20للتعامل\x20مع\x20الطريقة\x20الحقيقية.

package\x20com.w3codebox;
import\x20org.springframework.context.ApplicationContext;
import\x20org.springframework.context.support.ClassPathXmlApplicationContext;
public\x20class\x20Test\{
	public\x20static\x20void\x20main(String\[\]\x20args)\{
		ApplicationContext سياق = new classPathXmlApplicationContext("applicationContext.xml");
		Operation op = (Operation) context.getBean("opBean");
		op.msg();
		op.display();
	}
}

الإخراج

مشكلة إضافية قبل إجراء الطريقة الفعلية
يُدعى msg()
مشكلة إضافية بعد إجراء الطريقة الفعلية
مشكلة إضافية قبل إجراء الطريقة الفعلية
يُدعى display()
مشكلة إضافية بعد إجراء الطريقة الفعلية

يمكنك رؤية أن هناك أيضًا طباعة مشاكل أخرى قبل وتحت إجراء msg() وعرض الطريقة.


5. aop: after-throwing

من خلال استخدام النصائح بعد الرمي، يمكننا طباعة الاستثناء في فئة TrackOperation. دعونا نرى مثال نصيحة AspectJ AfterThrowing.

إنشاء فئة تحتوي على منطق الأعمال.

ملف: Operation.java

package\x20com.w3codebox;
public  class Operation{
	public void validate(int age)throws Exception{
	if(age<18){
		throw new ArithmeticException("عمر غير صالح");
	}
	else{
		System.out.println("شكراً للفوت");
	}
	}
}

إنشاء فئة الجانب التي تحتوي على النصيحة بعد إطلاق النصيحة.

في هنا، نحتاج إلى نقل مرجع Throwable حتى نتمكن من توقيف الاستثناء هنا.

ملف: TrackOperation.java

package\x20com.w3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	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("نهاية بعد إطلاق النصيحة...");
	}
}

ملف: 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-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd\x20
<aop:aspectj-autoproxy\/>
<bean\x20id="opBean"\x20class="com.w3codebox.Operation">\x20</bean>
<bean\x20id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect\x20id="myaspect"\x20ref="trackAspect"\x20>
     <!--\@AfterThrowing\-->
     <aop:pointcut\x20id="pointCutAfterThrowing"	expression="execution(*\x20com.w3codebox.Operation.*(..))"\/>
     <aop:after-throwing\x20method="myadvice"\x20throwing="error"\x20pointcut-ref="pointCutAfterThrowing"\/>
  </aop:aspect>
</aop:config>
</beans>

ملف:\x20Test.java

الآن\x20يتم\x20إنشاء\x20فئة\x20Test\x20للتعامل\x20مع\x20الطريقة\x20الحقيقية.

package\x20com.w3codebox;
import\x20org.springframework.context.ApplicationContext;
import\x20org.springframework.context.support.ClassPathXmlApplicationContext;
public\x20class\x20Test\{
	public\x20static\x20void\x20main(String\[\]\x20args)\{
		ApplicationContext\x20context\x20=\x20new\x20ClassPathXmlApplicationContext("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: Not valid age
نهاية بعد تقديم نصيحة بعد الارتفاع...
java.lang.ArithmeticException: Not valid age