قبل قراءة هذه المقالة ، يمكنك الرجوع إلى مقالة " الفهم البسيط لأمثلة IOC و AOP و AOP والرمز " لفهم المحتوى ذي الصلة من IOC و AOP بإيجاز. دعنا نصل إلى الموضوع.
ستنشئ هذه المقالة أبسط مثال خطوة بخطوة لاستخدام ميزات AOP الخاصة بـ Spring ، والتي تعتبر عرضًا تجريبيًا للمبتدئين لـ Spring AOP. كمبتدئين ، تم تشغيل مثل هذا العرض التوضيحي البسيط من قبل العديد من المزالق.
مشكلة OOP ، تكميلية لـ AOP
عندما نحتاج إلى إدخال السلوك العام للأشياء المتناثرة ، يبدو OOP عاجزًا. أي أن OOP يتيح لك تحديد العلاقات من أعلى إلى أسفل ، ولكنه غير مناسب لتحديد العلاقات من اليسار إلى اليمين. على سبيل المثال ، وظيفة التسجيل. غالبًا ما يكون رمز السجل مبعثرًا أفقيًا عبر جميع مستويات الكائنات دون أي علاقة بالوظائف الأساسية للكائن الذي ينتشر إليه. وينطبق الشيء نفسه على الأنواع الأخرى من التعليمات البرمجية ، مثل الأمان ومعالجة الاستثناءات والشفافية. هذا النوع من الكود غير ذي صلة المبعثر في كل مكان يسمى رمز قطع المتقاطع. في تصميم OOP ، يسبب الكثير من تكرار الكود ، والذي لا يفضي إلى إعادة استخدام كل وحدة.
ما يسمى "الجانب" ، ببساطة وضع ، يغلف المنطق أو المسؤوليات التي لا ترتبط بالعمل ، ولكنها تسمى بالاشتراك مع وحدة العمل ، مما يسهل تقليل تكرار النظام في الكود ، وتقليل الاقتران بين الوحدات النمطية ، وتعزيز قابلية التشغيل المستقبلية والمحافظة عليها.
دعم AOP في الربيع
وكيل AOP في الربيع مسؤول عن توليد وإدارة حاويات IOC في Spring ، كما تتم تبعياته أيضًا بواسطة حاويات IOC. لذلك ، يمكن أن يستهدف وكيل AOP حالات الفاصوليا الأخرى مباشرة في الحاوية ، ويمكن توفير هذه العلاقة عن طريق حقن التبعية لحاوية IOC. يستخدم Spring الوكيل الديناميكي Java لإنشاء وكيل AOP افتراضيًا ، بحيث يمكنه إنشاء وكيل لأي مثيل واجهة. عندما لا يكون الفصل الذي يحتاج إلى وكيل واجهة وكيل ، فإن Spring سوف يتحول تلقائيًا إلى استخدام وكيل CGLIB ، ويمكنه أيضًا إجبار CGLIB.
منطق هذا المثال هو كما يلي: هناك فئة سيارة (درجة الأعمال). قبل وبعد تشغيل طريقة GO في فئة السيارة ، سيكون هناك سجلات سجل مقابلة ، لكن فئة السيارة نفسها لا تعرف أي منطق للسجل.
قم بإنشاء مشروع Maven وأضف تبعيات
أولاً ، قم بإنشاء مشروع Maven جديد ، واستخدم قالب MavenarchetyPequickStart ، ثم افتح ملف pom.xml ، وأضف حزم التبعية المطلوبة لشراء AOP الربيع.
<Rependency> <roupEd> org.springframework </rougiD> <StifactId> Spring-core </stifactid> <sophy> 4.0.5 <soph> 4.0.5.release </version> </sependency> <redence> <roupiD> org.springframework </rougeid> <StifactId> SPRING-Context </shintifactid> <soph> 4.0.5.5 <StifactId> spring-context </artifactId> <soph> 4.0.5 <StifactId> SideJweaver </shintifactid> <soph> 1.8.1 </version> </reperency>
كتابة رمز الأعمال
تمت إضافة سيارة درجة الأعمال ، بما في ذلك طريقة GO ()
package com.wowo.spring_aop_demo1 ؛ class public car {public void go () {system.out.println ("go go go!") ؛ }}اكتب الجوانب
ستسجل فئة السجل تشغيل النظام ، ولكن لن يتم كتابة منطق السجل في كل مكان في درجة الأعمال ، ولكنه موجود كفئة للوجه.
package com.wowo.spring_aop_demo1 ؛ class public carlogger {public void beforerun () {system.out.println ("Car Going to Run") ؛ } public void Afterrun () {system.out.println ("Car is Running") ؛ }}تحتوي فئة هذا الجانب على طريقتين ، وهما التحويل المسبق وما بعد التعيين.
تكوين الجمعيات من خلال الفاصوليا
تمت إضافة ملف تكوين جديد ، يدعى Bean.xml في هذا المثال ، لربط الوجه والإخطارات في ملف التكوين
<؟ xmlns: p = "http://www.springframework.org/schema/p" XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/context/spring-context-2.5.xsd id = "car" /> <bean id = "logger" /> <aop: config> <aop: side ref = "logger"> <aop: pointcut expression = "execution (* com.wowo.spring_aop_demo1.car.go (..)) pointcut-ref = "go" method = "efrrun"/> </aop: side> </aop: config> </bans>
ملاحظة: في ملف التكوين هذا ، فإن مساحة اسم AOP والعناوين العديدة الواردة في XSI: التخصيص مطلوب.
التنفيذ (* com.wowo.spring_aop_demo1.car.go (..)) هو تعبير عن نقطة جانب. التنفيذ يعني التشغيل أثناء التنفيذ. ما يلي * يمثل قيمة الإرجاع لأي نوع. com.wowo.spring_aop_demo1.car يشير إلى الفصل حيث يوجد نقطة نقاط. GO (..) هو اسم الطريقة ، و ... يمثل أي معلمة.
هناك 5 أنواع من الإشعارات التي يمكن تطبيقها على أقسام الربيع:
・قبل ذلك-يتم استدعاء إشعار الاتصال قبل استدعاء الطريقة
・بعد-يتم استدعاء إشعار بعد اكتمال الطريقة ، بغض النظر عما إذا كان يتم تنفيذ الطريقة بنجاح.
・بعد العودة-يتم استدعاء إشعار الاستدعاء بعد تنفيذ الطريقة بنجاح
・إشعار ما بعد الرأي-دعوة بعد أن ألقي الطريقة استثناء
・حول-عدم صياغة حزم الطريقة التي تم إخطارها ، وتنفيذ سلوك مخصص قبل وبعد استدعاء الطريقة المبلغ عنها.
تشغيل رمز العمل
فيما يلي فئة تحتوي على الطريقة الرئيسية () لتشغيل رمز العمل
حزمة com.wowo.spring_aop_demo1 ؛ استيراد org.springframework.context.applicationContext classpathxmlapplicationContext ("bean.xml") ؛ سيارة = (سيارة) سياق. getBean ("سيارة") ؛ car.go () ؛ }}في الكود أعلاه ، يتم إنشاء كائن سيارة بحلول الربيع. عندما ينشئ الربيع هذا الكائن ، يجد أنه يتم تكوين إحدى طرقه على أنها نقطة. لذلك ، عند إنشاء كائن ، سيتم إنشاء كائن وكيل. عند تنفيذ طريقة قطع النقاط () ، سيتم اعتراضها بواسطة كائن الوكيل الذي أنشأه الربيع. قبل تشغيل طريقة GO ، سوف يطلق على Be Porererun () ، ثم استدعاء طريقة Car.go () ، ثم اتصل بعد العملية لفئة Carlogger Afterrun () بعد العملية.
ملاحظة: يجب استخدام الربيع لإنشاء كائن يحتوي على الظلال. إذا قمت بإنشائها بنفسك ، فلن تتمكن Spring من مراقبته ولن يتم إخطار تشغيله عن طريق تطبيق أي تطبيق.
نتيجة الإخراج للمشروع
ستذهب السيارة إلى GO GO! السيارة تعمل
استخدام الإخطارات المحيطة
إذا كنت ترغب في استخدام الإخطارات المحيطة ، فنحن بحاجة إلى تعديل طرق الإخطار وملفات التكوين في فئة الجانب. لا تحتاج درجة الأعمال إلى إجراء أي تعديلات لأنها منفصلة تمامًا. قم أولاً بتعديل قسم الفئة Carlogger
استيراد org.aspectj.lang.proceedingjoinpoint ؛ الفئة العامة carlogger {public void oundrun (proseingJoinPoint joinpoint) {system.out.println ("CAR GONT TO REN") ؛ جرب {// استدعاء الطريقة الهدف لكائن الوكيل ، في هذا المثال يشير إلى car.go () method coinpoint.proceed () ؛ } catch (throwable e) {E.PrintStackTrace () ؛ } system.out.println ("السيارة قيد التشغيل") ؛ }}تحتاج الطريقة المحيطة بالإشعار إلى قبول معلمات type proseingjoinpoint ، وستستدعي طريقة العملية () الطريقة المستهدفة لكائن الوكيل ، لذلك في ظل الظروف العادية ، يجب استدعاء هذه الطريقة. يمكننا أيضًا تنظيم تشغيل كائن الوكيل من خلال عدم استدعاء هذه الطريقة.
بعد ذلك ، قم بتعديل AOP: جزء التكوين من ملف التكوين إلى ما يلي
<aOP: config> <aop: side ref = "logger"> <aop: pointcut expression = "execution (* com.wowo.spring_aop_demo1.car.go (..))" id = "go"/> <aOp: ould ounder = "ounrun" pointcut-ref = "go"/
ملاحظة: لا يمكن أن توجد الإخطارات المحيطة في نفس الوقت مثل الإخطارات الأمامية/الخلفية. بعد تشغيل الكود ، تظل نتيجة الإخراج دون تغيير.
لخص
ما ورد أعلاه هو كل المحتوى المشترك في هذه المقالة حول مقدمة العرض التوضيحي لـ Spring AOP ، آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!