جدول المحتويات
1. الربيع AOP استنادًا إلى تكوين XML
2. استخدم التعليقات التوضيحية لتكوين AOP
3. وظيفة نقاط النقطة الجانبية
4. ملاحظات الإخطار الجانبية
5. تكوين صفر لتنفيذ الربيع IOC و AOP
AOP (Programming Sideed Worded) هي تقنية تنفذ التحكم الأفقي متعدد الوحدات الموحدة لوظائف البرنامج من خلال أساليب التحجيم والوكلاء الديناميكية أثناء وقت التشغيل. AOP هو ملحق لـ OOP وجزء مهم من إطار الربيع. يمكن عزل الأجزاء المختلفة من منطق العمل باستخدام AOP ، وبالتالي تقليل الاقتران بين أجزاء مختلفة من منطق العمل ، وتحسين قابلية استخدام البرنامج ، وتحسين كفاءة التطوير. يمكن تقسيم AOP إلى النسيج الثابت والنسج الديناميكي. لا يتطلب النسيج الديناميكي تغيير الوحدة النمطية المستهدفة. ينفذ Spring Framework AOP ، واستخدام التعليقات التوضيحية لتكوين AOP هو أكثر ملاءمة وبديهية من استخدام تكوين XML.
1. الربيع AOP استنادًا إلى تكوين XML
قبل شرح التعليق التوضيحي لتنفيذ وظيفة AOP ، استخدم أولاً التعلم السابق لتكوين وظيفة Spring AOP باستخدام XML ، بحيث تكون للمقارنة والفهم الأفضل.
1.1.
<project xmlns = "http://maven.apache.org/pom/4.0.0 g/xsd/maven-4.0.0.xsd "> <dormversion> 4.0.0 </modelversion> <rougiD> com.zhangguo </rougeid> <StifactId> spring052 </stifactid> <splection> 0.0.1-snapshot </version> <cloating> جرة </packaging> <ame> spring052 </ame> <Url> /properties> <Rependencies> <reperency> <roupiD> junit </rougiD> <intifactid> Junit </stifactid> <scope> اختبار </scope> <splection> 4.10 </version> </sependency> <reperency> <roupiD> org.springframework </rougled> <unsifactid> spring-contex /الاعتماد> <Rependency> <roupled> cglib </roughid> <StifactId> cglib </stifactid> <الإصدار> 3.2.4 </version> </respency> </perendencies> </project>
1.2.
حزمة com.zhangu.spring052 .out.println (N1+" النتيجة = n1 n2 ؛
1.3.
حزمة com.zhangguo.spring052.aop01 ؛ استيراد org.aspectj.lang.joinpoint ؛/** ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.4.
<؟ xml الإصدار = "1.0" الترميز = "UTF-8"؟ springframework.org/schema/p "xmlns: aop =" http://www.springframework.org/schema/aop " http://www.springframework.org/schema/beans/spring-beans.xsd /spring-AOP-4.3.XSD "> <!-كائن وكيل-> <bean id =" math "> </bean> <!-الإخطار-> <bean id =" addsices "> </bean> <! التعبير = "التنفيذ (* com.zhangguo.spring052.aop01.math.* (..))" id = "pointcut1"/> <! الفاصوليا>
1.5.
حزمة com.zhangguo.spring052.Aop01 ؛ استيراد org.springframework.context.applicationContext XML ") ؛ Math Math = ctx.getBean (" Math "، Math.Class) ؛ int n1 = 100 ، n2 = 5 ؛ Math.Add (N1) ؛نتائج التشغيل:
2. استخدم التعليقات التوضيحية لتكوين AOP
2.1. يعادل إضافة حبة إلى ملف تكوين XML في المثال السابق ، <!-كائن الوكيل-> <bean id = "math"> </bean> ، ورمز فئة الرياضيات كما يلي:
package com.zhangguo.spring052 } // استبدال public int sub (int n1 ، int n2) {int result = n1-n2 ؛ System.out.println (N1+" println (n1+"/"+n2+"=2.2.
حزمة com.zhangguo.spring052.aop02 ؛ استيراد org.aspectj.lang.joinpoint /@component@SidePublic Class Advices {before ("التنفيذ (* com.zhangguo.spring052.aop02.math.*(..)) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------الرمز أعلاه هو في الأساس نفس التكوين التالي
<!-الإخطارات-> <bean id = "advices"> </bean> <!-تكوين AOP-> <aop: config proxy-t-class = "true"> <!-section-> <aop: side ref = "advices" /> <!-توصيل طريقة الإخطار والنقطة-> <aop: قبل method = "قبل" pointcut-ref = "pointcut1"/> <aop: بعد method = "بعد" pointcut-ref = "pointcut1"/> </aop: side> </ aop: config>
2.3.
<؟ xml الإصدار = "1.0" الترميز = "UTF-8"؟ springframework.org/schema/p "xmlns: aop =" http://www.springframework.org/schema/aop " XSI: schemalocation = "http://www.springframework.org/schema/beans ework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd "> <السياق: مكون مسكك الأساس package = "com.zhangguo.spring052.aop02"> </context: component-scan> <aop: ackingj-autoproxy proxy-target-class = "true"> </aop: mesidentj-atoproxy> </bans>
2.4.
package com.zhangguo.spring052 ml ") ؛ Math Math = ctx.getBean (" Math "، Math.Class) ؛ int n1 = 100 ، n2 = 5 ؛ Math.Add (N1) ؛نتائج التشغيل:
3. وظيفة نقاط النقطة الجانبية
يمكن وضع وظيفة Tangent في موقف منطقي دقيق. الاستهداف.
يستخدم AspectJ تعبير SideBJ الخاص بمساحة النقطة لوصف القسم.
وظيفة Point Point: تحدد نقاط الاتصال من خلال وصف معلومات طريقة الفئة الهدف.
وظيفة Point Point Point Point: تحدد نقاط الاتصال من خلال وصف معلومات المعلمة لطريقة الفئة الهدف.
دالة نقاط الفئة المستهدفة: يحدد نقاط الاتصال من خلال وصف معلومات نوع الفئة المستهدفة.
وظيفة نقطة فئة Agent Class: تحدد نقاط الاتصال من خلال وصف معلومات فئة الوكيل.
وظائف التعبير الجانبي الشائع:
الوظيفة الأكثر شيوعًا التي يتم استخدامها هي: التنفيذ (<وضع Modifier>؟ <وضع نوع الإرجاع> <وضع اسم الطريقة> (<وضع المعلمة>) <وضع الاستثناء>؟) وظيفة نقطة ، والتي يمكن أن تلبي معظم الاحتياجات.
من أجل إظهار وظائف كل وظيفة الظل ، يتم الآن إضافة strutil فئة جديدة ، والفئة هي كما يلي:
package com.zhangguo.spring052.aop03 ؛ استيراد org.springframework.stereotype.Component ("Strutil") strutil {public void show () {system.out.println ("Hello Strutil!") ؛رمز الاختبار كما يلي:
package com.zhangguo.spring052 ml ") ؛ imath math = ctx.getBean (" Math "، Math.Class) ؛ int n1 = 100 ، n2 = 5 ؛ Math.Add (N1 ، Math.Sub (N1) ؛3.1.
حزمة com.zhangguo.spring052.aop03 ؛ استيراد org.aspectj.lang.joinpoint /@component@SidePublic Class Advices {before ("التنفيذ (* com.zhangguo.spring052.aop03.math.*(..)) يتم قطع حزمة 03 إلى After ("التنفيذ (*com.zhangguo.spring052.aop03.*.*(..)) System.out.println ("-------------------------------") ؛نتائج التشغيل كما يلي:
التنفيذ (<وضع المعدل>؟ <وضع نوع الإرجاع> <وضع اسم الطريقة> (<وضع المعلمة>) <وضع الاستثناء>؟)
3.2.
// ضمن وظيفة point // com.zhangguo.spring052 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.3
. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.4
// args point cut function // تتطلب أن تكون الطريقة لها مرجعين من النوع int قبل أن يتم نسجها إلى منطق الشحن المتقاطع ("args (int ، int)") ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ إذا لم يكن نوع المعلمة هو نوع البيانات الأساسي ، فسيكون اسم الحزمة مطلوبًا.
3.5
تخصيص أولا تعليقًا توضيحيًا يمكن شرحه على الطريقة
package com.zhangguo.spring052.aop03 ؛ import java.lang.annotation ention(retentionpolicy.runtime)@documentedpublic interface myanno {} //@annotation point-cut function//Require that the method must be annotated com.zhangguo.Spring052.aop03.MyAnno to be weaved into the transverse cutting logic @After("@annotation(com.zhangguo.Spring052.aop03.MyAnno)") public void after(JoinPoint jp){ System.out.println("-------------------------------"); } package com.zhangguo.spring052.Aop03 ؛ استيراد org.springframework.stereotype.Component ("strutil"نتائج التشغيل:
وظائف قطع النقاط الأخرى مع @ هي للشرح
4. ملاحظات الإخطار الجانبية
هناك 6 تعليقات إشعار في SideJ ، 5 شائع الاستخدام ، ويتم استخدام مقدمات أقل.
أولاً ، قم بحل مشكلة تحديد تعدد الإرسال ، كما هو موضح في الكود التالي ، محتوى وظيفة Point Tangent هو نفسه تمامًا:
حزمة com.zhangguo.spring052.aop04 ؛ استيراد org.aspectj.lang.joinpoint /@component@SidePublic Class Advices {before ("التنفيذ (* com.zhangguo.spring052.aop04.math.*(..)) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------يمكنك أولاً تحديد الظل ثم تعدده على النحو التالي:
حزمة com.zhangguo.spring052.aop04 ؛ استيراد org.aspectj.lang.joinpoint /@component@SidePublic Class Advices { // 切点PointCut ("execution (* com.zhangguo.spring052.aop04.math.* (..)) )) ؛ System.out.println ("-------------------------------") ؛قم بتعديل ملف advices.java وأضف أنواع الإشعارات المختلفة على النحو التالي:
package com.zhangguo.spring052.aop04 ؛ import org.aspectj.lang.joinpoint ؛ import org.aspectj.lang.proceditingjoinpoint ؛ annotation.around ؛ import org.aspectj.lang.annotation.around ؛ import org.aspectj.lang.annotation.Aspect ؛ import org.aspectj.lang.annotation.before ؛ import ؛ import ؛ org.aspectj.lang.annotation.pointCut ؛ استيراد org.springframework.stereotype ؛/*** class class ، منطق متقاطع*/@componn oticebofore ("pointcut ()") public void قبل (JoinPoint jp) { system.out.println (jp.getSignature (). getName ()) ؛ --------------------------------------------------------------------------------------------------------------------------------------- {system.out.println (pjp.getSignature (). ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- بعد الظهر (JONPOINT JP ، نتيجة الكائن) {system.out.println (jp.getSignature (). -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- system.out.println (jp.getSignature (). getName ()) ؛ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------نتائج التشغيل:
5. تكوين صفر لتنفيذ الربيع IOC و AOP
من أجل تحقيق تكوين صفر ، استنادًا إلى المثال الأصلي ، نضيف فئة جديدة تشبه المستخدم كما هو موضح أدناه:
حزمة com.zhangguo.spring052.Aop05 ؛ مستخدم الفئة العامة {public void show () {system.out.println ("كائن مستخدم") ؛لا يتم شرح هذا الفصل ولن تتم إدارة الحاوية تلقائيًا. نظرًا لعدم وجود ملف تكوين XML ، استخدم واحدة كمعلومات تكوين ، وملف ApplicationCfg.java كما يلي:
package com.zhangguo.spring052 y ؛ configuration // فئة التكوين المستخدمة لتمثيل الفئة الحالية كحاوية ، على غرار <beans/>@componentscan (basePackages = "com.zhanguo.spring052.aop05") // نطاق المسح يعادل عقدة تكوين XML <السياق: مكون-سكان/> enableAspectjautoproxy (proxytargetclass = true) // auto proxy ، expantive thertipro acploC في التكوين ، أي ما يعادل <bean id = getUser/> bean المستخدم العام getUser () {return new user () ؛كل جزء من هذه الفئة لديه علاقة فردية مع تكوين XML. رمز الاختبار كما يلي:
حزمة com.zhangguo.spring052.aop05 ؛ استيراد org.springframework.context.applicationcontext ؛ ] args) {// تهيئة الحاويات من خلال Application Crass Ctx = جديد anotationconfigplicationst (applicationcfg.class) ؛ = ctx.getBean ("getuser" ، user.class) ؛ advices.java هو نفسه كما هو مذكور أعلاه ، دون أي تغييرات ، والنتيجة الجارية هي كما يلي:
ما سبق هو كل محتوى هذه المقالة.