English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يعطي Spring1.2 أوب قديم (قائم على dtd) مثال على التنفيذ.
على الرغم من أن الدعم كان متاحًا في Spring 3، إلا أن استخدام نصائح يتم في الصفحة القادمة التي سنتعلم فيها كيفية استخدام Spring aop مع AspectJ.
يدعم تنفيذ aop القديم في spring1.2 أربعة أنواع من نصائح.
Before Advice، يتم تنفيذها قبل استدعاء الطريقة الفعلية. After Advice، يتم تنفيذها بعد استدعاء الطريقة الفعلية. إذا كان هناك قيمة استعادة للطريقة، يتم تنفيذها بعد قيمة الاستعادة. Around Advice، يتم تنفيذها قبل وبعد استدعاء الطريقة الفعلية. Throws Advice، إذا أحدث الطريقة استثناءً فعليًا، يتم تنفيذ النصيحة هذه.
لنفهم هيكل نصائح من خلال الشكل التالي:
جميعها واجهات في 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)