0.about aop
تعد البرمجة الموجهة نحو الجانب (AOP) موضوعًا ساخنًا في تطوير البرمجيات وجزء مهم من إطار الربيع. يمكن عزل الأجزاء المختلفة من منطق العمل باستخدام AOP ، وبالتالي تقليل الاقتران بين أجزاء مختلفة من منطق العمل ، وتحسين قابلية استخدام البرنامج ، وتحسين كفاءة التطوير.
AOP هو استمرار OOP.
الوظائف الرئيسية هي: التسجيل ، إحصائيات الأداء ، التحكم في الأمان ، معالجة المعاملات ، معالجة الاستثناء ، إلخ.
القصد الرئيسي هو تقسيم الرموز مثل التسجيل ، وإحصائيات الأداء ، والتحكم في الأمان ، ومعالجة المعاملات ، ومعالجة الاستثناء ، وما إلى ذلك من رمز منطق العمل. من خلال فصل هذه السلوكيات ، نأمل في فصلها إلى أساليب منطق تجارية غير موجهة ، ثم تغيير هذه السلوكيات دون التأثير على رمز منطق العمل.
يمكن تحقيق التكنولوجيا التي تضيف وظائف ديناميكيًا إلى البرامج دون تعديل الكود المصدري من خلال طرق التحجيم والوكالة الديناميكية أثناء وقت التشغيل. AOP هو في الواقع استمرار لنموذج تصميم GOF. يتبع نموذج التصميم فصلًا عن الفصل بين المتصل والكالي ، مما يحسن مرونة الكود وقابلية التوسع. يمكن القول أن AOP هو تطبيق لهذا الهدف.
يوفر الدعم الغني للبرمجة الموجهة نحو الجانب في فصل الربيع ، مما يتيح تطويرًا متماسكًا من خلال فصل منطق الأعمال للتطبيق من الخدمات على مستوى النظام مثل التدقيق وإدارة المعاملات. كائنات التطبيق تنفذ فقط ما يجب عليهم فعله - أكمل منطق الأعمال - هذا كل شيء. إنهم ليسوا مسؤولين (أو حتى على دراية) بالمخاوف الأخرى على مستوى النظام ، مثل التسجيل أو دعم المعاملات.
1. تحميل ملفات التكوين الخارجية الأخرى أو ملفات الخصائص في الربيع من خلال PropertyHolderConfigurer:
في العديد من مشاريع جافاي ، دور الربيع مهم للغاية. إنها حاوية خفيفة الوزن تدير الوحدات والمكونات الأخرى. غالبًا ما يحتاج Spring إلى إدارة الدعامات ، ibatis ، السبات ، إلخ. بالإضافة إلى ذلك ، يمكن أيضًا تحميل معلومات اتصال قاعدة البيانات ، وملفات معلومات اتصال JNDI ، وما إلى ذلك. الاستخدام كما يلي:
(1). تحميل ملفات أخرى في الربيع من خلال propertyholderConfigurer:
أضف التكوين التالي في ملف تكوين الربيع:
<bean class = "org.springframework.beans.factory.config.propertyplaceholderConfigurer"> <property name = "socations"> <Sale> classpath: اسم الملف لتحميل </value> ... </property>
(2). يتم تحميل التكوين أو ملف السمة المراد تحميله من خلال التكوين في (1) في فصل الربيع. إذا كنت بحاجة أيضًا إلى استخدام بعض المعلومات حول التكوين أو ملف البيانات المحمّل في وقت التشغيل ، مثل استخدام معلومات اتصال قاعدة البيانات أو معلومات اتصال JNDI ، يمكنك استخدام بناء جملة تعبيرات النوع EL للإشارة ، على سبيل المثال:
<bean id = "dataSource" تدمير method = "close" class = "org.apache.common.dbcp.basicdataSource"> <!-افترض أن معلومات اتصال قاعدة البيانات مكتوبة في ملف خاصية خارجي وتم تحميلها بواسطة up- <name property = "username" value = "$ {username}"/> <property name = "password" value = "$ {password}"/> </bean>
ملاحظة: يمكنك أيضًا استخدام <Context: Property-PlaceholderLocation = "classpath: اسم الملف للتحميل"/>
2. الوكيل الديناميكي لجافا:
مبدأ التنفيذ الأساسي في Spring هو وكيل ديناميكي ، لذلك يجب عليك أولاً فهم الوكيل الديناميكي قبل التعلم البرمجة الموجهة نحو الجانب.
يتم استخدام الوكيل الديناميكي على نطاق واسع في Java ، والوكالة الديناميكية هي واحدة من أنماط التصميم الكلاسيكية التي يتم استخدامها بشكل شائع جدًا في أنماط التصميم في 23. مبدأ الوكيل الديناميكي هو أنه عندما يتم استدعاء كائن مستهدف أو طريقة مستهدفه من خلال هذا الكائن المستهدف من خلال هذا الكائن المستهدف.
المبدأ البسيط للوكيل الديناميكي هو كما يلي:
المتصل العميل -> كائن وكيل -> يسمى الكائن الهدف.
عندما يقوم العميل باستدعاء كائن الوكيل ، يقوم كائن الوكيل بتفويض الكائن الهدف للاتصال بأسلوب أعماله.
ينقسم الوكيل الديناميكي إلى نوعين: الوكيل الديناميكي للواجهات والوكيل الديناميكي للفئات العادية. الوكيل الديناميكي في Java هو وكيل ديناميكي للواجهات الحقيقية. CGLIB هو وكيل ديناميكي للفصول العادية. تحتوي حزمة تبعية Javaee المستهدفة وحزمة جرة الربيع بالفعل على حزم جرة متعلقة بـ CGLIB ، بحيث يمكنك أن تكون فئات الوكيل أو العادية بشكل ديناميكي.
(1).
الوكيل الديناميكي في Java لا يمكن أن يكون الوكيل ديناميكيًا للواجهات. لذلك ، يجب أن ينفذ الكائن الهدف واجهات ، ويجب أن ينفذ كائن الوكيل جميع واجهات الكائن الهدف. سير العمل كما يلي:
أ. كتابة فئة الوكيل الديناميكي:
ملاحظة: يجب على الوكيل الديناميكي تطبيق واجهة InvocationHandler ، وتنفيذ الطرق التالية:
نسخة الكود كما يلي:
استدعاء الكائن (مثيل وكيل ObjectM ، مثيل طريقة طريقة الواجهة المسمى على مثيل الوكيل طريقة ، كائن [] صفيف كائن من قيم المعلمة التي تم تمريرها في مثيل الوكيل) ؛
تم شرح وثائق تثبيت JDK. يتم استخدام هذه الطريقة لتمرير مثيل الوكيل ، وتحديد كائن java.lang.reflect.method الذي يستدعي الطريقة ، ومجموعة من نوع الكائن التي تحتوي على المعلمات. يعالج معالج المكالمات استدعاء الطريقة المشفرة بطريقة مناسبة ، وسيتم إرجاع النتيجة التي يتم إرجاعها نتيجة لمكالمة الطريقة على مثيل الوكيل.
ب. إنشاء كائن وكيل:
proxy.newproxyinstance (تحميل فئة ، فئة <؟> [] صفيف واجهة ، كائن وكيل رد الاتصال (عادة هذا))
عندما يتم استدعاء طريقة الكائن الهدف ، يتم إنشاء كائن الوكيل للكائن الهدف من خلال الطريقة. سيقوم كائن الوكيل تلقائيًا باستدعاء طريقة الاستدعاء الخاصة به للاتصال بالكائن الهدف وإرجاع نتيجة المكالمة.
(2) .cglib هو وكيل ديناميكي لفئات Java العادية:
عندما ينشئ CGLIB وكيلًا ديناميكيًا ، فإنه لا يتطلب فئة الهدف لتنفيذ واجهة. سير العمل الخاص به على النحو التالي:
أ. كتابة فئة الوكيل الديناميكي:
Enhancer Enhancer = New Enhancer () ؛ // قم بتعيين الفئة الأصل للفئة المستهدفة على ensancer.setsuperClass (الكائن الفئة الهدف. getClass ()) ؛ // قم بتعيين كائن رد الاتصال على كائن الوكيل الديناميكي نفسه المحسن.
ب. قم بتنفيذ واجهة MethodInterceptor:
تنفيذ الطريقة التالية:
اعتراض الكائن (مثيل وكيل ObjectM ، مثيل طريقة طريقة الواجهة المسمى On Method Proxy مثيل ، Object [] صفيف كائن من قيم المعلمة التي تم تمريرها إلى استدعاء الطريقة على مثيل الوكيل ، مثيل الوكيل طريقة طريقة MethodProxy) ؛
ملاحظة: لا يمكن لـ CGLIB الوكيل ديناميكيًا للفئات فحسب ، ولكن أيضًا بالوكالة الديناميكية للطرق.
3. المفاهيم الأساسية للبرمجة الموجهة (AOP):
خذ طريقة Java عادية كمثال
اسم طريقة الإرجاع العام اسم طريقة (قائمة المعلمة) {-> طريقة الإخطار المحيط رمز المعالجة المسبقة-> تجرب ما قبل التصرف {طريقة تنفيذ محدد (طريقة هيئة) ... طريقة ما بعد المعالجة رمز-> ما بعد الإلغاء} catch (استثناء نوع e) {استثناء معالجة ...
أ. القلق المتقاطع: على سبيل المثال ، في مواقع الإخطار 5 أعلاه ، في كائنات Java ، تسمى هذه الكائنات ذات منطق معالجة مشترك مماثل يمكن إضافتها إلى معالجة منطق مثل التحقق من الإذن ، ومعالجة الأشياء ، وتسجيلها ، وما إلى ذلك. إن تركيز البرمجة الموجهة للكائنات (OOP) هو تجريد الأشياء رأسياً في العالم الحقيقي في نموذج كائن برمجة. إن تركيز البرمجة الموجهة نحو الجانب (AOP) أفقي ، والذي يملأ أماكن مماثلة لمنطق معالجة نموذج كائن البرمجة لتشكيل الظل ، في حين أن منطق المعالجة في كائن البرمجة هو تركيز الظل الأفقي.
ب. الجانب: استخلاص المخاوف المتقاطعة هو تكوين قسم ، يشبه الفصل. الاثنان لديهما مخاوف مختلفة. الفصول الدراسية هي تجريدات لخصائص الأشياء ، والأقسام هي تجريدات من المخاوف المتقاطعة.
ج. JoinPoint: يشار إلى النقطة التي يتم اعتراضها في الربيع ، لأن Spring يدعم فقط نقاط اتصال من نوع الطريقة ، أي الطريقة المعتادة. الطريقة كما هو موضح في المثال أعلاه.
د. PointCut: يشير إلى تعريف اعتراض نقطة الاتصال ، وهي مجموعة من نقاط الاتصال ، أي مجموعة من سلسلة من الأساليب المقابلة.
ه. النصيحة: تشير إلى ما يجب القيام به بعد اعتراض نقطة الاتصال ، أي المعالجة المنطقية بعد الاعتراض. يتم تعريف التحقق من الإذن المعتاد ومعالجة الأشياء والتسجيل والعمليات الأخرى وإكمالها في الإخطارات.
و. الهدف: الكائن الهدف للوكالة ، أي الكائن المعترض. كما في المثال أعلاه ، الكائن الذي توجد به الطريقة.
ز. نسج: يشير إلى عملية تطبيق قسم على الكائن المستهدف والتسبب في إنشاء كائن وكيل.
ح. مقدمة: دون تعديل الكود ، يمكن للمقدمة إضافة بعض الطرق والحقول ديناميكيًا إلى الفصل أثناء وقت التشغيل.
4. يدعم الربيع التبعيات التي تدعم البرمجة الموجهة (AOP):
يتم إلغاء ضغط الحزم الثلاث التالية في الدليل بعد الربيع:
lib/sidej/sidejweaver.jarlib/sidej/sidejrt.jarlib/cglib/cglib-nodep-2.1-3.jar
5. عند استخدام البرمجة الموجهة نحو الجانب (AOP) في الربيع ، تحتاج إلى تقديم مساحة اسم AOP في ملف تكوين الربيع ، أي إضافة التكوين التالي:
xmlns: aop = "http://www.springframework.org/schema/aop" "http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd "
ملاحظة: يوفر Spring 2.5 طريقتين AOP ، وهما ، استنادًا إلى ملف تكوين XML وطريقة توضيح Java.
لاستخدام طريقة التعليقات التوضيحية AOP ، تحتاج إلى إضافة طريقة شرح الكائن التالية دعم AOP في ملف تكوين الربيع:
<aOP: SideJ-Autoproxy/>
6. فئة التغليف Javabean - BeanWrapper:
يلف Spring سلوك Javabean من خلال فئة BeanWrapper ، ويمكنه تعيين قيم السمة والحصول عليها ، مثل:
BeanWrapper class class object = beanwrapperimpl (class class ()) ؛ clospper class object.setPropertyValue ("اسم الخصائص" ، "قيمة الخاصية") ؛
تتيح لك هذه الطريقة تعيين خصائص على الفئة ملفوفة.
7. تطوير البرمجة الموجهة نحو الموجهة نحو التعليق التوضيحي:
(1). إضافة دعم AOP لطرق التعليقات التوضيحية في ملف تكوين الربيع.
(2). حدد القسم:
على غرار إنشاء فئة عادية ، فإن إضافة التعليق التوضيحي "aspect" قبل الفصل يشير إلى أن الفصل هو قسم.
(3). أضف نقاط الدخول إلى سطح القطع:
نقطة قطع النقاط هي مجموعة من أساليب الكائنات المعتادة. عادةً ما يتم تعريف نقطة قطع النقاط في طريقة لمعالجة نقطة قطع النقاط في القسم. استخدم التعليق التوضيحي "pointcut" ، وبناء الجملة كما يلي:
@pointcut ("التنفيذ (*com.test.service ..*.
شرح مفصل لمعلمات بناء الجملة:
أ. الأول "*": يعني أن الطريقة التي يتم اعتراضها هي نوع إرجاع تعسفي.
ب. com.test.service: هنا مثال بسيط ، يشير إلى اسم الحزمة المراد اعتراضها ، أي الحزمة المراد اعتراضها.
ج. الاثنان ".." بعد اسم الحزمة المعتادة: يعني أن الحجز الفرعي أسفل الحزمة المعتادة يتم اعتراضهم أيضًا بشكل متكرر ، أي الحزمة الفرعية المعتادة.
د. "*" بعد "..": يمثل جميع الفئات الموجودة أسفل الحزمة المعتادة وحقائبها الفرعية ، أي الفئة المعتقة.
ه. آخر "*": يمثل جميع الطرق في الفئة المعتادة ، أي الطريقة المقابلة.
و. "(..)": يعني أن الطريقة المعتادة تتلقى أي معلمات ، أي المعلمات المعتقة.
ملاحظة: يمكن أن يدعم بناء جملة تعريف النقاط أحرف Bildcard ، ولكن يجب عليك اتباع قواعد بناء الجملة بدقة. يحب:
@pointcut ("التنفيذ (*com.test.service ..*. إضافة*(..))") وهذا يعني اعتراض الأساليب بدءًا من "إضافة" في جميع الفئات تحت حزمة com.test.service وحقائبها الفرعية.
(4). إضافة إشعارات إلى القسم:
لمواقع الإخطار في الربيع ، يرجى الرجوع إلى الأمثلة الصغيرة في 3.
"before" التعليق التوضيحي: إعلان عملية التعليق المسبقة.
"AfterRutruning" التعليق التوضيحي: إعلان ما بعد التعيين.
التعليق التوضيحي "After": إعلان الإشعار النهائي.
"AfterThrowing" التعليق التوضيحي: إعلان إعلان الإخطار.
التعليق التوضيحي "AROUND": يعلن الإخطارات المحيطة.
مثال على تحديد الإخطارات هو كما يلي:
before ("anymethod () (اسم نقطة الدخول المعلن في الوجه الشق)") public void doAccessCheck () {...}
ملاحظة: يختلف الإخطار المحيطي قليلاً عن الأنواع الأربعة الأخرى من الإخطارات. يتم تعريف الإخطار المحيط بطريقة خاصة. سيعمل الإشعار المحيط قبل وبعد استدعاء الطريقة بأكملها ، لذلك يجب استخدام كائن نقطة الاتصال لمعرفة نقطة الاتصال لمواصلة معالجتها المنطقية بعد معالجة الإخطار المحيطي. تعريفه كما يلي:
around (ابحث في اسم النقطة) كائن عام dobasicprofiling (الإجراءات storingjoinpoint pjp) يلقي رمي {... return pjp.proceed () ؛ // تخبر هذه الجملة نقطة الاتصال لمواصلة إجراء عمليات أخرى} 8. بعض النصائح لتطوير البرمجة الموجهة نحو الجانب (AOP) بناءً على التعليقات التوضيحية:
(1). الحصول على معلمات الإدخال:
يحب:
before ("اشترك في اسم النقطة && args (اسم معلمة الإدخال)") public void dosomething (اسم معلمة إدخال السلسلة) {...}
(2). احصل على نتيجة العودة:
يحب:
apterReturning (pointCut = "sign in point name" ، return = "اسم نتيجة الإرجاع") public void dosomething (اسم نتيجة السلسلة) {...}
9. تطوير البرمجة الموجهة نحو القسم (AOP) على أساس XML:
(1). تحديد فئة الوجه وإضافة إشعارات إلى فئة الوجه.
(2). قم بتكوين فئة Facet في ملف تكوين الربيع مثل فئة Java العادية.
(3). إضافة تكوين AOP في ملف تكوين الربيع على النحو التالي:
<aOP: config> <!-قسم التكوين-> <aop: معرف الجانب = "معرف القسم" ref = "معرف فئة القسم في ملف تكوين الربيع"> <!-نقطة التكوين-> <aop: pointcut id = "section id" expression = "execution (*com.test.service ..*. أساليب المعالجة في فئة القسم "/> <aop: بعد .../> ... </aop: الجانب> </aop: config>
10. معالجة معاملات الربيع (معالجة المعاملات التعريفية في الربيع):
ببساطة ، تشير المعاملة إلى واحدة من العمليات الأساسية في قاعدة البيانات. سيتم شرح شرح مفصل للمعاملة بالتفصيل في ملخص قاعدة البيانات. أحد أهم تطبيقات البرمجة الموجهة نحو الربيع (AOP) هي إدارة المعاملات. تدعم إدارة المعاملات في Spring 2.5 والإصدارات اللاحقة نوعين من الأساليب المستندة إلى التعليقات التوضيحية والطرق المستندة إلى ملفات XML:
(1). إدارة المعاملات بناءً على طريقة التعليقات التوضيحية:
أ. أضف مساحة اسم إدارة المعاملات في ملف تكوين الربيع على النحو التالي:
Xmlns: ts = http: //www.springframework.org/schema/tx http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx
ب. قم بتكوين مدير المعاملات في ملف تكوين الربيع على النحو التالي:
<bean id = "txmanager" class = "org.springframework.jdbc.datasource.datasourcetransactionManager"> <property name = "datasource" ref = "id of data source bean configned in spring"/>
ج. إضافة عناصر تكوين المعاملة التي تدعم طرق التعليق التوضيحي في ملف تكوين الربيع هي كما يلي:
<TX: التعليق التوضيحي-المنحرف-المدير TX: التعليقات التوضيحية-المنقحة-ماناجير = "TxManager (معرف مدير المعاملات الذي تم تكوينه في الربيع)"/>
د. استخدم إدارة المعاملات المستندة إلى التعليقات التوضيحية:
في مشروع Javaee الذي يديره الربيع ، يجب إضافة منطق العمل للمعاملة مع التعليق التوضيحي "transactional".
(2). إدارة المعاملات بناءً على طريقة ملف XML:
أ. قم بتكوين مدير المعاملات في ملف تكوين الربيع على النحو التالي:
<bean id = "txmanager" class = "org.springframework.jdbc.datasource.datasourcetransactionManager"> <property name = "datasource" ref = "id of data source bean configned in spring"/>
ب. أضف الأقسام التالية من إدارة الأشياء في ملف تكوين الربيع:
<aOP: config> <!-تكوين نقطة إدخال المعاملة-> <aop: pointcut id = "TransactionPointCut" التعبير = "التنفيذ (*com.test.service ..*.*.ج. أضف الميزات التالية لإشعارات المعاملات في ملف تكوين الربيع:
<tx: exply id = "txadvice" TransactionManager = "TxManager"> <tx: entributes> <!-إليك مثال على تعيين طريقة الاستعلام التي تبدأ بالوصول إلى القراءة فقط ، ولا تدعم المعاملات-> <TX: method name = "get*" read-only = "true" sparcation = "not_suded". <tx: method name = "*"/> </tx: attributes> </tx: explive>