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

مثال على Spring AOP

يعطي Spring1.2 أوب قديم (قائم على dtd) مثال على التنفيذ.

على الرغم من أن الدعم كان متاحًا في Spring 3، إلا أن استخدام نصائح يتم في الصفحة القادمة التي سنتعلم فيها كيفية استخدام Spring aop مع AspectJ.

يدعم تنفيذ aop القديم في spring1.2 أربعة أنواع من نصائح.

Before Advice، يتم تنفيذها قبل استدعاء الطريقة الفعلية. After Advice، يتم تنفيذها بعد استدعاء الطريقة الفعلية. إذا كان هناك قيمة استعادة للطريقة، يتم تنفيذها بعد قيمة الاستعادة. Around Advice، يتم تنفيذها قبل وبعد استدعاء الطريقة الفعلية. Throws Advice، إذا أحدث الطريقة استثناءً فعليًا، يتم تنفيذ النصيحة هذه.

ملاحظة: للتعرف على مفاهيم Spring AOP الأساسية، يرجى زيارة الصفحة السابقة.

هيكل نصائح

لنفهم هيكل نصائح من خلال الشكل التالي:

جميعها واجهات في aop.

MethodBeforeAdvice واجهة توسيعت BeforeAdvice الواجهة.

AfterReturningAdvice واجهة توسيعت AfterAdvice الواجهة.

ThrowsAdvice توسيع الواجهة AfterAdvice الواجهة.

MethodInterceptor توسيع الواجهة واجهة الواجهة. تستخدم حول Advice.

1. مثال على MethodBeforeAdvice

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

ملف: A.java

package com.w3codebox;
public class A {
public void m(){System.out.println("business logic");}
}

الآن، أنشئ فئة مستشارة تعمل على تحقيق MethodBeforeAdvice.

ملف: BeforeAdvisor.java

package com.w3codebox;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class BeforeAdvisor implements MethodBeforeAdvice{
	@Override
	public void before(Method method, Object[] args, Object target) throws Throwable {
		System.out.println("الاهتمام الإضافي قبل اللغة الفعلية");
	}
}

في ملف xml، أنشئ 3 صفحات، واحدة لفئة A، الثانية لفئة Advisor، الثالثة لـ ProxyFactoryBean الصفحة.

ملف: 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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="obj" class="com.w3codebox.A"></bean>
<bean id="ba" class="com.w3codebox.BeforeAdvisor"></bean>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="obj"></property>
<property name="interceptorNames">
<list>
<value>ba</value>
</list>
</property>
</bean>
</beans>

فهم فئة ProxyFactoryBean:

ProxyFactoryBean الصفحة من Spring Famework. يحتوي على 2 خصائص: target و interceptorNames. يتم اعتبار مثال على فئة A كهدف، ويتم اعتبار مثال على فئة Advisor كمكتب استشارة. يجب عليك إرسال مكتب الاستشارة كقائمة من خلال مثل ملف xml المقدم.

كتابة ProxyFactoryBean كالتالي:

public class ProxyFactoryBean{
private Object target;
private List interceptorNames;
// getters and setters
}

الآن، دعونا نكتب الطريقة الفعلية.

ملف: Test.java

package com.w3codebox;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Test {
public static void main(String[] args) {
	Resource r=new ClassPathResource("applicationContext.xml");
	BeanFactory factory=new XmlBeanFactory(r);
	A a = factory.getBean("proxy", A.class);
	a.m();
}
}

الإخراج

الاهتمام الإضافي قبل اللغة الفعلية
اللغة الفعلية للأعمال

في MethodBeforeAdvice، يمكننا طباعة معلومات أخرى، مثل اسم الطريقة، معلمات الطريقة، الهدف الموضوع، اسم فئة الهدف، فئة الوكيل، وما إلى ذلك.

فقط باید dwóch کلاس BeforeAdvisor.java و Test.java را تغییر دهید.

ملف: BeforeAdvisor.java

package com.w3codebox;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class BeforeAdvisor implements MethodBeforeAdvice{
	@Override
	public void before(Method method, Object[] args, Object target) throws Throwable {
		System.out.println("الاهتمام الإضافي قبل اللغة الفعلية");
		System.out.println("method info:"+method.getName()+" "+method.getModifiers());
		System.out.println("معلومات المعامل:")
		for (Object arg : args)
			System.out.println(arg)
		System.out.println("الهدف Object:" + target)
		System.out.println("اسم فئة الهدف: " + target.getClass().getName())
	}
}

ملف: Test.java

package com.w3codebox;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Test {
public static void main(String[] args) {
	Resource r=new ClassPathResource("applicationContext.xml");
	BeanFactory factory=new XmlBeanFactory(r);
	A a = factory.getBean("proxy", A.class);
        System.out.println("اسم فئة الوكيل: " + a.getClass().getName())
	a.m();
}
}

الإخراج

اسم فئة الوكيل: com.w3codebox.A$EnhancerByCGLIB$409872b1
الاهتمام الإضافي قبل اللغة الفعلية
معلومات الطريقة:m 1
معلومات المعامل
الهدف Object:com.w3codebox.A@11dba45
اسم فئة الهدف: com.w3codebox.A
اللغة الفعلية للأعمال

مثال على AfterReturningAdvice

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

ملف: A.java

مثل المثال السابق

الآن، قم بإنشاء فئة مستشار تنفذ واجهة AfterReturningAdvice.

ملف: AfterAdvisor.java

package com.w3codebox;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class AfterAdvisor implements AfterReturningAdvice{
	@Override
	public void afterReturning(Object returnValue, Method method,
         Object[] args, Object target) throws Throwable {
		System.out.println("concern بعد العودة إلى النصائح الإضافية")
	}
}

أنشئ ملف xml مثل المثال السابق، ما تحتاجه هو تغيير فئة المستشار هنا.

ملف: 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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="obj" class="com.w3codebox.A"></bean>
<bean id="ba" class="com.w3codebox.AfterAdvisor">
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="obj"></property>
<property name="interceptorNames">
<list>
<value>ba</value>
</list>
</property>
</bean>
</beans>

ملف: Test.java

مثل المثال السابق

الإخراج

اللغة الفعلية للأعمال
الاهتمام الإضافي بعد إعادة النصيحة

مثال على MethodInterceptor (AroundAdvice)

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

ملف: A.java

مثل المثال السابق

الآن، أنشئ فئة مستشار تحقق واجهة MethodInterceptor.

ملف: AroundAdvisor.java

package com.w3codebox;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class AroundAdvisor implements MethodInterceptor{
	@Override
	public Object invoke(MethodInvocation mi) throws Throwable {
		Object obj;
		System.out.println("الاهتمام الإضافي قبل اللغة الفعلية");
		obj=mi.proceed();
		System.out.println("الاهتمام الإضافي بعد اللغة الفعلية");
		return obj;
	}
}

أنشئ ملف xml مثل المثال السابق، ما تحتاجه هو تغيير فئة المستشار هنا.

ملف: 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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="obj" class="com.w3codebox.A"></bean>
<bean id="ba" class="com.w3codebox.AroundAdvisor"></bean>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="obj"></property>
<property name="interceptorNames">
<list>
<value>ba</value>
</list>
</property>
</bean>
</beans>

ملف: Test.java

مثل المثال السابق

الإخراج

الاهتمام الإضافي قبل اللغة الفعلية
اللغة الفعلية للأعمال
الاهتمام الإضافي بعد اللغة الفعلية

مثال على ThrowsAdvice

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

ملف: Validator.java

package com.w3codebox;
public class Validator {
	public void validate(int age)throws Exception{
		if(age<18){
			throw new ArithmeticException("Not Valid Age");
		}
		else{}}
			System.out.println("تم تأكيد الصوت");
		}
	}
}

الآن، أنشئ كلاس المستشار الذي يحقق واجهة ThrowsAdvice.

ملف: ThrowsAdvisor.java

package com.w3codebox;
import org.springframework.aop.ThrowsAdvice;
public class ThrowsAdvisor implements ThrowsAdvice{
	public void afterThrowing(Exception ex){
		System.out.println("المشكلة الإضافية إذا حدثت استثناء");
	}
}

أنشئ ملف xml كما في المثال السابق، ما تحتاجه هو تغيير كلاً من كلاس Validator وAdvisor.

ملف: 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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="obj" class="com.w3codebox.Validator"></bean>
<bean id="ba" class="com.w3codebox.ThrowsAdvisor"></bean>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="obj"></property>
<property name="interceptorNames">
<list>
<value>ba</value>
</list>
</property>
</bean>
</beans>

ملف: Test.java

package com.w3codebox;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Test {
public static void main(String[] args) {
	Resource r=new ClassPathResource("applicationContext.xml");
	BeanFactory factory=new XmlBeanFactory(r);
	Validator v=factory.getBean("proxy",Validator.class);
	try{
	v.validate(12);
	}catch(Exception e){e.printStackTrace();}
}
}

الإخراج

java.lang.ArithmeticException: Age غير صالح
الاهتمام الإضافي إذا حدثت استثناء
	في com.w3codebox.Validator.validate(Validator.java:7)
	في com.w3codebox.Validator$FastClassByCGLIB$562915cf.invoke(<generated>)
	في net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
	في org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invoke
Joinpoint(Cglib2AopProxy.java:692)
	في org.springframework.aop.framework.ReflectiveMethodInvocation.
proceed(ReflectiveMethodInvocation.java:150)
	في org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.
invoke(ThrowsAdviceInterceptor.java:124)
	في org.springframework.aop.framework.ReflectiveMethodInvocation.
proceed(ReflectiveMethodInvocation.java:172)
	في org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.
intercept(Cglib2AopProxy.java:625)
	في com.w3codebox.Validator$EnhancerByCGLIB$4230ed28.validate(<generated>)
	في com.w3codebox.Test.main(Test.java:15)