عندما يتعلق الأمر بـ AOP ، ستفكر بالتأكيد في الربيع لأن هذا الشيء قوي للغاية. ولكن يجب أن تكون واضحًا أن AOP هي فكرة برمجة ، والربيع هو مجرد تطبيق AOP.
أولا ، بايدو:
في صناعة البرمجيات ، AOP هو اختصار للبرمجة الموجهة نحو الجانبين ، مما يعني: تقنية تنفذ صيانة موحدة لوظائف البرنامج من خلال أساليب التحميل المسبق والعوامل الديناميكية أثناء وقت التشغيل. AOP هو استمرار لـ OOP ، وهو موضوع ساخن في تطوير البرمجيات ، وجزء مهم من إطار الربيع ، ونموذج مشتق للبرمجة الوظيفية. يمكن عزل الأجزاء المختلفة من منطق العمل باستخدام AOP ، وبالتالي تقليل الاقتران بين أجزاء مختلفة من منطق العمل ، وتحسين قابلية استخدام البرنامج ، وتحسين كفاءة التطوير.
اليوم ، دعونا نستخدم الوكيل الأصلي Java لتنفيذ وظائف AOP البسيطة.
أولاً ، تحتاج إلى معرفة معرفة الانعكاس الأساسية ، وإلا فقد تشعر بالارتباك.
لا مزيد من الكلمات ، فقط ابدأ في الكتابة
أولاً ، دعنا نكتب واجهة بسيطة. الاسم هو AnimalInterface ، والذي يستخدم لإعلان بعض الطرق الأساسية لتنظيم الحيوانات.
تتضمن هذه الأساليب تحديد الأسماء ، والحصول على الأسماء ، والمكالمات ، والسمات (سامحني لعدم تعليمها ، في الواقع ، هو الحصول على ما إذا كانت الأرض أو المائية أو البرمائية)
Package Proxy.imp ؛ public interface AnimalInterface {// اضبط اسم void setName (اسم السلسلة) ؛ // الحصول على اسم سلسلة getName () ؛ // call void says () ؛ // احصل على الفراغ الدائم getProperty () ؛}ثم ننفذ هذه الواجهة وننشئ كلبًا يدعى Xiao Hei
Package Proxy ؛ import proxy.imp.animalInterface ؛ public class dogippipes animalinterface {private string name = "xiaohei" ؛ public dogimp () {} Override public void setName (اسم السلسلة) {this.name = name ؛ } Override public string getName () {return this.name ؛ } override public void says () {system.out.println ("puppy: wool wool wool ......") ؛ } Override public void getProperty () {system.out.println ("Puppy هو حيوان أرض ، ولكن يمكن للسباحة") ؛ }} يجب أن يكون الجميع صبرًا لتحقيق وظائف تشبه AOP ...
دعنا ننشئ أولاً فئة تسمى Aophandle لتنفيذ واجهة InvocationHandler. عندما لا يمكنك استخدام الاستدعاء ، الوكيل كمعلمة انعكاس ، لأن واجهة كائن الوكيل تختلف عن كائن ما ، فإن آلية الوكيل هذه موجهة نحو الواجهة بدلاً من الموجهة إلى الفئة. إذا كنت تستخدم الوكيل ، فسيؤدي ذلك إلى عودة لا حصر لها. ثم هناك فائض مكدس ، ولكن لا يزال من الممكن أن ينعكس بنجاح مرة واحدة. هذا يدل على أن كائن الوكيل ووكيل الكائن مختلفان. ومع ذلك ، يمكننا الحصول على كائن الفئة من خلال proxy.getClass () من المعلمة الوكيل ، ثم الحصول على طرق ومعلمات فئة الوكيل. يوفر هذا أيضًا طريقة تنفيذ لحقن التعليقات التوضيحية ، وحقن الطريقة المحددة ، وحقن السمة. لنتحدث عن هذا لاحقًا.
Package Proxy ؛ import java.lang.reflect.invocationHandler ؛ import java.lang.reflect.method ؛ public class aophandle تنفذ invocationHandler {// حفظ الكائن الخاص o object o ؛ Aophandle العامة (كائن O) {this.o = o ؛ } /*** سيتم استدعاء هذه الطريقة تلقائيًا ، سيتم تمرير آلية الوكيل الديناميكي Java* في المعلمة التالية* Param Object Proxy الواجهة لكائن الوكيل ، تختلف عن الكائن* param طريقة تسمى Method* param Object [] args parameters* عندما لا يمكنك استخدام incy ، proxy كمعلمة انعكاس ، لأن the the the the the the tofface about is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is is the fo. آلية الوكيل هذه موجهة نحو الواجهة ، وليس موجهة إلى الفئة **/Override الكائن العام الاستدعاء (وكيل الكائن ، طريقة الطريقة ، الكائن [] args) يلقي رمي {// طريقة إرجاع كائن ret = null ؛ // print method name system.err.println ("طريقة التنفيذ:"+method.getName ()+"نوع المعلمة هو:") ؛ // print parameter لـ (نوع الفئة: method.getParameterTypes ()) system.err.println (type.getName ()) ؛ // طباعة نوع الإرجاع system.err.println ("نوع بيانات الإرجاع:"+method.getReturnType (). getName ()) ؛ // طريقة استدعاء الانعكاس ret = method.invoke (o ، args) ؛ // إعلان النظام النهائي .RER.PRINTLN ("نهاية تنفيذ الطريقة") ؛ // إرجاع قيمة الإرجاع لطريقة المكالمة العاكسة إرجاع RET ؛ }}تم الانتهاء من الوكيل الديناميكي ... ثم الحيوانات الخاصة بنا ... ودعونا نستمر
Package Proxy ؛ import java.lang.reflect.proxy ؛ public class animalfactory { /**** الحصول على طريقة الكائن* param obj* @return* /كائن ثابت خاص getAnimalBase (object obj) {// get proxy compl return proxy.newproxyinstance (obj.getclass (). obj.getClass (). getInterfaces () ، new aophandle (obj)) ؛ } / **** الحصول على طريقة الكائن* param obj* return* / suppressWarnings ("Unchecked") public static t getanimal (object obj) {return (t) getanimalbase (obj) ؛ } / **** الحصول على طريقة الكائن* param className* return* / suppressWarnings ("Unchected") public static t getanimal (سلسلة className) {Object obj = null ؛ حاول {obj = getAnimalBase (class.forname (className) .NewInstance ()) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } return (t) obj ؛ } / **** احصل على طريقة الكائن* param clz* return* / suppressWarnings ("Unchecked") public static t getanimal (class clz) {object obj = null ؛ حاول {obj = getAnimalBase (clz.newinstance ()) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } return (t) obj ؛ }} وأخيرا هذه هي النهاية ... ما هو مفقود؟ تعال إلى هنا لترى التأثير ...
هاها ... النادل ، سأخدم ... أوه لا ، إنها فئة اختبار ... هاها ///
package proxy ؛ import org.junit.test ؛ import org.junit.runner.runwith ؛ import org.junit.runners.blockJunit4ClassRunner test1 () {animalinterface dog = AnimalFactory.getAnimal (dogimp.class) ؛ dog.say () ؛ System.out.println ("اسمي"+dog.getName ()) ؛ Dog.SetName ("Ergouzi") ؛ System.out.println ("اسمي"+dog.getName ()) ؛ }} ماذا؟ ما ، في النهاية ، هذا مفيد ، أليس هذه خدعة؟ مجرد التقاط هذا الشيء ، ما هو الفائدة ...
أي نوع من AOP ، لماذا لا أرى أي AOP ، كيف يمكنني إدخال الطريقة المخصصة؟ مجرد مدخلات Syso ، وخدع الجمهور في هذا؟ ....
حسنًا ، ثم دعنا نمضي قدماً ونرى كيفية تنفيذ الطريقة المخصصة المحقونة ...
أولاً ، أضف واجهة ، دعنا نسميها واجهة حقن AOP. اسمه aopmethod
إنشاء بعد وخلف الأساليب ، استقبل وكيل الكائن ، طريقة الطريقة ، الكائن [] المعلمات args
هذا سيفعل المزيد من الأشياء ... على سبيل المثال ، قبل تنفيذ الطريقة ، قم بتسجيل حالة الفصل ، واكتب السجل. مراقبة متغير XX ،،،
افتح عقلك.
package proxy.imp ؛ import java.lang.reflect.method ؛ الواجهة العامة aopmethod {// method method قبل تنفيذ طريقة المثيل باطل بعد (وكيل الكائن ، طريقة الكائن ، الكائن [] args) ؛ // الطريقة التي يتم تنفيذها بعد تنفيذ طريقة المثيل باطل قبل (وكيل الكائن ، طريقة الطريقة ، الكائن [] args) ؛} ثم تعديل فئة Aophandle وأضف خاصية AopMethod.
قم بتعديل طريقة المنشئ للحصول على مثيل AopMethod عند تهيئة الفصل.
أخيرًا ، قم بتعديل طريقة الاستدعاء .... انتقل إلى الكود مباشرة
Package Proxy ؛ import java.lang.reflect.invocationHandler ؛ import java.lang.reflect.method ؛ import proxy.imp.aopmethod ؛ public class aophandle تنفذ invocationHandler {// save object experge private method ؛ كائن خاص o ؛ Aophandle العامة (كائن O ، طريقة aopmethod) {this.o = o ؛ this.method = method ؛ } /*** سيتم استدعاء هذه الطريقة تلقائيًا ، آلية الوكيل الديناميكي Java* سيتم تمرير المعلمة التالية في* param proxy الواجهة لكائن الوكيل تختلف عن الكائن* @param method method method* @param comforme [] args methods* at invoke لا يمكن استخدامها عند استخدام proxy كمعلمة interxy*. هو موجه الواجهة ، وليس موجه الفئة **/ Override الكائن العام استدعاء (وكيل الكائن ، الطريقة ، الكائن [] args) رمي {كائن ret = null ؛ // مكان التعديل هو هنا. ret = method.invoke (o ، args) ؛ // مكان التعديل هنا this.method.after (الوكيل ، الطريقة ، args) ؛ العودة }} هوهو ، تتم المهمة ، ويبدو أن كل شيء يمثل مشكلة ، لطيف ...
قم بتحديث فئة الاختبار الآن ...
Package Proxy ؛ import java.lang.reflect.method ؛ import org.junit.runner.runwith ؛ import org.junit.runners.blockjunit4classrunner static void main (string [] args) {AnimalInterface dog = AnimalFactory.GetAnimal (dogimp.class ، new aopmethod () {// هنا هي طريقة قطع aOP قبل تنفيذ الطريقة العامة قبل (method) طريقة القطع AOP بعد تنفيذ الفراغ العام بعد (وكيل الكائن ، الطريقة ، الكائن [] args) {system.err.println ("أنا في" + method.getName () + "التنفيذ بعد تنفيذ الطريقة") ؛ dog.say () ؛ name name1 = "اسمي" + dog.getName () ؛ system.out.println (name1) ؛ Dog.SetName ("Ergouzi") ؛ name name2 = "اسمي"+dog.getName () ؛ System.out.println (name2) ؛ }} هوهو ، عزيزي ، هل تشعر بالحقن؟ هل تشعر أنك قطعت طريقتك الخاصة فيها ؟؟؟ هاها ...
يبدو أن كل شيء مثالي ، لكنني أشعر دائمًا أن هناك شيئًا ما مفقودًا؟ أوه ، نعم ، هناك نقص في ملفات التكوين مثل الربيع.
في الواقع ، هذه هي بالفعل بسيطة للغاية. دعنا نتركهم لك. فقط صمم تنسيق XML وانتظر ، ماذا تقول؟ لا يمكنك اعتراض الأساليب المخصصة؟
لا يمكن اعتراض الأساليب المخصصة مثل الربيع؟ OH ~~ لا ، في الواقع ، يمكنك استخدام الطريقة و methodname لإصدار حكم قبل (وكيل الكائن ، الطريقة ، الكائن [] args) لاستخدام الطريقة وإعطاء methodname.
بالطبع ، ليس لهذا المثال أهمية عملية ، ولا يمكن مقارنته بمختلف أطراف AOP المثالية. توفر لك هذه المقالة طريقة تفكير فقط ، ولكن يجب أن تتذكر أنه بغض النظر عن مدى روعة الأشياء ، فهي متراكمة شيئًا فشيئًا
مثال تنزيل: http://xiazai.vevb.com/201701/yuanma/javaaop_jb51.rar
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.