مقدمة
توفر البرمجة الموجهة نحو الأمراض (AOP) منظوراً آخر للتفكير في بنية البرنامج ، والتي تعوض عن أوجه القصور في البرمجة الموجهة للكائنات (OOP). بالإضافة إلى الفصول الدراسية ، يوفر AOP جوانب. قم بتركيب التركيز ، مثل إدارة المعاملات المتقاطعة لأنواع وكائنات متعددة. (يشار إلى هذه المصطلحات الاهتمام غالبًا على أنها مخاوف متقاطعة.)
مكون رئيسي في الربيع هو إطار AOP. على الرغم من ذلك ، لا تعتمد حاويات IOC الربيعية على AOP ، مما يعني أنك حرة في اختيار ما إذا كنت تريد استخدام AOP. يوفر AOP حلًا قويًا للوسيط ، مما يجعل حاويات IOC Spring أكثر اكتمالًا.
ربيع 2.0 AOP:
يقدم Spring 2.0 طريقة أبسط وأكثر قوة لتخصيص القسم ، ويمكن للمستخدمين اختيار استخدام الأساليب المستندة إلى المخطط أو استخدام التعليقات التوضيحية ASPECTJ. بالنسبة للتطبيقات الجديدة ، إذا كان المستخدم يتطور في Java 5 ، فإننا نوصي المستخدم باستخدام نمط AaspectJ ، وإلا يمكن استخدام النمط القائم على النمط. يدعم كلتا الأسلوبان تمامًا نوع النصيحة ولغة نقاط من جانب الجانب ، على الرغم من أنه لا يزال ينسج باستخدام الربيع AOP.
يناقش هذا الفصل أساسًا دعم Spring 2.0 لـ AOP المستندة إلى الأنماط و @SideJ. Spring 2.0 يحتفظ تمامًا بالتوافق المتخلف عن الربيع 1.2. سيناقش الفصل التالي دعم AOP الأساسي الذي توفره SPRING 1.2 API.
AOP المستخدمة في الربيع:
يتم توفير خدمات المؤسسات التعريفية ، خاصة بدلاً من خدمات EJB التعريفية. أهم خدمة هي إدارة المعاملات التعريفية ، والتي تم تصميمها على تجريد المعاملات التجريدية في الربيع.
يسمح للمستخدمين بتنفيذ أقسام مخصصة واستخدام AOP لتحسين استخدام OOP.
مثال
غالبًا ما نستخدم الأنواع التالية
1. AOP على أساس الوكيل
2. جوانب جافا نقية وبسيطة
3. نموذج التعليق التوضيحي
4. دعنا نطبق أقسام ASPCET في الحقن من واحد تلو الآخر.
دعنا نكتب بعض الفصول الأساسية أولاً.
فئة الواجهة:
/ *** حدد واجهة*/ واجهة عامة قابلة للنوم {/ *** طريقة النوم*/ void sleep () ؛ } فئة التنفيذ:
/ *** أقوم بتنفيذ واجهة النوم*/ الطبقة العامة تشينلينا تنفذ قابلة للنوم {Override public void sleep () {// todo method method method system.out.println ("كن جيدًا ، لقد حان الوقت للذهاب إلى الفراش!") ؛ }} فئة التحسين:
/ *** حدد تعزيز النوم لتحقيق كل من Sleephelper قبل وبعد الطبقة العامة ، MethodBeAdeadVice ، بعد returningAdvice {Override public void بعد التحطيم ("إرجاع الكائن ، طريقة الطريقة ، الكائن ، الهدف الكائن) ، يلقي رمي {system.out.Ut.println" } Override public void قبل (طريقة الطريقة ، الكائن [] args ، هدف الكائن) يلقي رمي {system.out.println ("Dream After Sleeping") ؛ }}1. AOP القائم على الوكيل
<!-قم بإنشاء نصيحة محسّنة-> <bean id = "sleephelper"/> <bean id = "lina"/> <!-تحديد نقاط التطابق مع جميع أساليب النوم-> <bean id = "sleppointcut"> <property name = "pattern" <property name = "excder" ref = "sleephelper"/> <property name = "pointcut" ref = "sleppointcut"/> </bean> <!-تحديد كائن وكيل-> <bean id = "linaproxy"> <property name = "target" ref = "lina" name = "proxyInterfaces" value = "com.tgb.springaop.service.sleepable"/> -> </bean>
كما في ملف التكوين:
تحدد سمة النمط تعبيرًا منتظمًا. يطابق جميع أساليب النوم. استخدم org.springframework.aop.support.defaultPointCutAdvisor للجمع بين نقطة الظل والتعزيز لتشكيل الظل الكامل. بعد اكتمال التكوين النهائي ، يتم إنشاء كائن الوكيل النهائي من خلال org.springframework.aop.framework.proxyfactorybean.
2. جوانب جافا نقية وبسيطة
كيف تقول أن جوانب جافا بسيطة بحتة؟ في رأيي ، فإنه يتعلق بالتكوين الأول ، والذي لا يتطلب استخدام وكيل ، ولكنه يمسح تلقائيًا من خلال الآلية الداخلية للربيع. في هذا الوقت ، يجب تعديل ملف التكوين الخاص بنا على النحو التالي:
<!-قم بإنشاء نصيحة محسّنة-> <bean id = "sleephelper"/> <!-فئة الهدف-> <bean id = "lina"/> <!-تكوين نقاط الإشعارات والإشعارات-> <bean id = "sleepadvisor"> <property name = "explive ref =" sleephelper "> </propert <bean/>
هل هو أبسط بكثير من الأول؟ لا حاجة لتكوين الوكيل بعد الآن؟
3. نموذج التعليق التوضيحي
بناءً على تجربتنا ، نعلم أيضًا أن شكل التعليقات التوضيحية أبسط من ملف التكوين. في هذا الوقت ، تحتاج إلى التعليق على الأساليب أو الفصول الحالية:
/ ***أضف تحسينًا من خلال التعليق التوضيحي*/ aspect @component الفئة العامة sleephelper03 {/* @pointcut ("التنفيذ (*com.tgb.springaop.service.impl ..*(..)) public void be ForsEporesleep () {system.out.println ("تطبيق قناع الوجه قبل النوم") ؛ } AfterReturning ("SleePpoint ()") public void aftersleep () {system.out.println ("Dream After Sleeping") ؛ }
فقط اكتب في ملف التكوين:
<!-حزمة المسح الضوئي-> <السياق: مكون-سكان قاعدة backage = "com.tgb" التعليق التوضيحي- config = "true"/> <!-الجوانب التعليق التوضيحي-> <aOP: ackingj-autoproxy proxy-target-class = "true"/> <!
4. أسطح ASPCET في شكل الحقن
أنا شخصياً أشعر أن هذا هو أبسط ، والأكثر استخدامًا ، والأكثر مرونة. ملف التكوين كما يلي:
<!-فئة الهدف-> <bean id = "lina"/> <bean id = "sleephelper"/> <aop: config> <aOP: side ref = "sleephelper"> <aop: قبل method = "be forseleep" pointcut = "execution ( * * *. </aop: Side> </aop: config>
فئة SleepHelper02 المذكورة في ملف التكوين هي كما يلي:
/ *** إضافة تحسين من خلال التعليقات التوضيحية*/ الطبقة العامة SleepHelper02 {public void be ForsElep () {system.out.println ("قم بتطبيق قناع الوجه قبل النوم") ؛ } public void aftersleep () {system.out.println ("Dream After Element") ؛ }}
هل تبدو بسيطة جدا؟ هل تستخدم جميع الربيع aop؟ !
فيما يتعلق بكيفية الاتصال ، كتبت عدة فصول اختبار هنا. يمكنك إلقاء نظرة عليه. هم في الأساس نفس:
/ *** ملف التكوين spring_aop.xml عبر proxy*/ test public void test () {applicationContext ct = new ClassPathmLapplicationContext ("spring_aop.xml") ؛ sleeper القابل للنوم = (قابل للنوم) ct.getBean ("Linaproxy") ؛ sleeper.sleep () ؛ } / *** ملف التكوين spring_aop_01.xml إجابة جافا كائن Java* / test public void test01 () {ApplicationContext ct = classpathxmlapplicationcontext ("spring_aop_01.xml") ؛ sleeper القابلة للنوم = (قابلة للنوم) ct.getBean ("lina") ؛ sleeper.sleep () ؛ } / *** ملف التكوين spring_aop_03.xml مشروح حسب الجانب* / test public void test03 () {applicationContext ct = new ClassPathMlapplicationContext ("spring_aop_03.xml") ؛ sleeper القابلة للنوم = (قابلة للنوم) ct.getBean ("lina") ؛ sleeper.sleep () ؛ } / *** ملف التكوين spring_aop_02.xml ملف التكوين من خلال apsect* Author Chen Lina* version 31 مايو 2015 في 10:09:37 AM* / Test Public Void test02 () sleeper القابلة للنوم = (قابلة للنوم) ct.getBean ("lina") ؛ sleeper.sleep () ؛ }
من فئة الاختبار ، يمكننا أن نرى أنه بغض النظر عن الطريقة التي ننفذ بها AOP ، فإن استخدامها لا يختلف. نتائج فئات الاختبار هذه هي نفسها: