1. مقدمة
في المشاريع السابقة ، نادراً ما اهتمت بالتنفيذ المحدد ونظرية الربيع AOP. لقد فهمت باختصار ماهية AOP وكيفية استخدامه. رأيت منشورًا مدونة مكتوب جيدًا ، لذلك جئت لتعلمه.
aop
يمكن القول أن AOP (البرمجة الموجهة نحو الجانب) ، أي البرمجة الموجهة نحو الجانب ، هي ملحق وتحسين OOP (البرمجة الموجهة للكائنات). يقدم OOP مفاهيم مثل التغليف والميراث وتعدد الأشكال لإنشاء تسلسل هرمي كائن يستخدم لمحاكاة مجموعة من السلوك العام. ومع ذلك ، يسمح OOP للمطورين بتحديد العلاقات الرأسية ، ولكنه غير مناسب لتحديد العلاقات الأفقية ، مثل وظائف التسجيل. غالبًا ما يكون رمز السجل مبعثرًا أفقيًا في جميع مستويات الكائنات ، ولا علاقة له بالوظائف الأساسية للكائن المقابل. هذا النوع من الكود غير المرتبط المبعثر في كل مكان يسمى القطع المتقاطعة. في تصميم OOP ، يسبب كمية كبيرة من تكرار الكود ، والذي لا يفضي إلى إعادة استخدام كل وحدة.
على العكس من ذلك ، تستخدم تقنية AOP تقنية تسمى "Crosscutting" لتشريح داخل كائن مغلف وتغليف تلك السلوكيات الشائعة التي تؤثر على فئات متعددة في وحدة قابلة لإعادة الاستخدام وتسمية "جانب" ، وهو الوجه. يتم تغليف ما يسمى "القسم" ببساطة بالمنطق أو المسؤوليات التي لا تتعلق بالرجال ، ولكنها تسمى وحدة العمل بالاشتراك ، والتي تكون مريحة لتقليل الكود المكررة للنظام ، وتقليل الاقتران بين الوحدات النمطية ، والاتفاقية إلى قابلية التشغيل والمحافظة على المستقبل.
باستخدام تقنية "Crosscutting" ، يقسم AOP نظام البرمجيات إلى جزأين: القلق الأساسي والقلق المتقاطع. العملية الرئيسية لمعالجة الأعمال هي التركيز الأساسي ، والجزء الذي لا علاقة له به هو التركيز المستعرض. تتمثل إحدى ميزات المخاوف المتقاطعة في أنها تحدث غالبًا في اهتمامات متعددة ، وهي متشابهة بشكل أساسي في أماكن مختلفة ، مثل مصادقة الإذن والسجلات والأشياء. يتمثل دور AOP في فصل المخاوف المختلفة في النظام وفصل المخاوف الأساسية عن المخاوف المتقاطعة.
مفهوم AOP الأساسي
1. نقاط الانتباه المتقاطعة
ما هي الطرق لاعتراض وكيفية التعامل معها بعد الاعتراض؟ تسمى هذه المخاوف المخاوف الشاملة
2. القسم (الجانب)
الفصول هي تجريدات لميزات الكائنات ، والأقسام هي تجريدات من المخاوف المتقاطعة
3. Joinpoint
النقطة المعتادة ، لأن الربيع يدعم فقط نقاط اتصال من نوع الطريقة ، وبالتالي تشير نقطة الاتصال في الربيع إلى اعتراض الطريقة. في الواقع ، يمكن أن تكون نقطة الاتصال حقلًا أو مُنشئًا.
4. نقطة
تعريف نقاط الاتصال
5. الإخطار (نصيحة)
يشير الإخطار المزعوم إلى الرمز الذي سيتم تنفيذه بعد اعتراض نقطة الاتصال. تنقسم الإخطارات إلى خمس فئات: الإخطارات المحددة مسبقًا ، وبعد المحددة ، والاستثناء ، والنهائي ، والمحيط.
6. كائن مستهدف
الكائن المستهدف للوكالة
7. نسج
عملية تطبيق شق على كائن مستهدف وتسبب في إنشاء كائن الوكيل
8. مقدمة
بدون تعديل الكود ، يمكن للمقدمة إضافة بعض الطرق أو الحقول إلى الفصل ديناميكيًا خلال فترة وقت التشغيل
دعم الربيع لـ AOP
وكيل AOP في الربيع مسؤول عن توليد وإدارة حاوية IOC في Spring ، وتتم إدارة تبعياته أيضًا بواسطة حاوية IOC. لذلك ، يمكن أن يستهدف وكيل AOP حالات الفاصوليا الأخرى مباشرة في الحاوية ، ويمكن توفير هذه العلاقة عن طريق حقن التبعية لحاوية IOC. قواعد إنشاء وكيل في الربيع هي:
1. بشكل افتراضي ، يتم استخدام الوكيل الديناميكي Java لإنشاء وكيل AOP ، بحيث يمكنك إنشاء وكيل لأي مثيل واجهة.
2. عندما لا يكون الفصل الذي يحتاج إلى وكيل واجهة وكيل ، سيتم تحويل Spring إلى استخدام وكيل CGLIB ، ويمكن أن يجبر CGLIB أيضًا على استخدامه.
برمجة AOP هي في الواقع شيء بسيط للغاية. بالنظر إلى برمجة AOP ، يحتاج المبرمجون فقط إلى المشاركة في ثلاثة أجزاء:
1. تحديد مكونات الأعمال العادية
2. تحديد نقطة الدخول ، قد تتقاطع نقطة إدخال واحدة من مكونات الأعمال المتعددة
3. تحديد المعالجة المحسنة. المعالجة المحسنة هي إجراء المعالجة الذي يتم نسجه إلى مكونات الأعمال العادية في إطار AOP.
لذلك ، فإن مفتاح برمجة AOP هو تحديد نقطة الدخول وتحديد معالجة التحسين. بمجرد تحديد نقطة الدخول المناسبة ومعالجة التحسين ، سيقوم إطار AOP تلقائيًا بإنشاء وكيل AOP ، أي طريقة كائن الوكيل = معالجة تحسين كائن الوكيل.
فيما يلي قالب ملفات .xml من الربيع المسماة aop.xml ، ويتم توسيع المحتويات اللاحقة على aop.xml:
<؟ xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/Aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd "> </beans>
التنفيذ البسيط لـ AOP على أساس الربيع
لاحظ أنه قبل التوضيح ، اسمحوا لي أن أشرح: لتشغيل الرمز بنجاح ، لا يكفي استخدام حزمة JAR التي توفرها الربيع للمطور. يرجى تنزيل حزمتين جرة على الإنترنت:
1. aopalliance.jar
2. SideJweaver.Jar
دعنا نبدأ في شرح طريقة تطبيق XML لـ Spring AOP ، حدد أولاً واجهة:
الواجهة العامة HelloWorld {void printhelloworld () ؛ void doprint () ؛} تحديد فئتين لتنفيذ الواجهة:
الطبقة العامة HelloWorldImpl1 تنفذ HelloWorld {public void printhelloworld () {system.out.println ("Enter HelloWorldImpl1.Printhelloworld ()") ؛ } public void doPrint () {system.out.println ("Enter HelloWorLdImpl1.doprint ()") ؛ يعود ؛ }} الطبقة العامة HelloWorldImpl2 تنفذ HelloWorld {public void printhelloworld () {system.out.println ("Enter HelloWorldImpl2.Printhelloworld ()") ؛ } public void doPrint () {system.out.println ("Enter HelloWorLdImpl2.doprint ()") ؛ يعود ؛ }} التركيز المتقاطع ، هنا هو وقت الطباعة:
الفصل الدراسي العام {public void printtime () {system.out.println ("currenttime =" + system.currentTimeMillis ()) ؛ }} مع هذه الفصول الثلاث ، يمكنك تنفيذ AOP ربيع بسيط. ألقِ نظرة على تكوين Aop.xml:
<؟ xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/Aop http://www.springframework.org/schema/aop/spring-aop-4 id = "addallmethod" expression = "execution (* com.xrq.aop.helloworld.* (..))" /> <aop: قبل method = "printtime" pointcut-ref = "addallmethod" /> <aOP: بعد method = "printtime" pointcut-ref =
اكتب وظيفة رئيسية للاتصال بها:
public static void main (string [] args) {applicationContext ctx = new ClassPathxMlapplicationContext ("aop.xml") ؛ HelloWorld HW1 = (HelloWorld) ctx.getBean ("HelloWorldImpl1") ؛ HelloWorld HW2 = (HelloWorld) ctx.getBean ("HelloWorLdImpl2") ؛ hw1.printhelloworld () ؛ System.out.println () ؛ hw1.doprint () ؛ System.out.println () ؛ System.out.println () ؛ hw2.printhelloworld () ؛ System.out.println () ؛ hw2.doprint () ؛} النتيجة الجارية هي:
CurrentTime = 14461296119993enter HelloWorLdImpl1.Printhelloworld () CurrentTime = 1446129611993CurrentTime = 1446129611994enter HelloWorldImpl1.doprint () Current Time = 1446129611999999 HelloWorldImpl2.printhelloworld () Current Time = 14461296119944currentTime = 1446129611994enter HelloWorldImpl2.doperrint () CurrentTime = 14461296119944
لقد رأيت أنه تمت إضافة جميع طرق فئتي التنفيذ في واجهة HelloWorld إلى الوكيل ، وأن محتوى الوكيل هو وقت الطباعة.
تفاصيل إضافية حول استخدام AOP المستند إلى الربيع
1. إضافة قلق الشق وطباعة السجل. فئة جافا هي:
الفئة العامة loghandler {public void logbefore () {system.out.println ("log قبل الطريقة") ؛ } public void logafter () {system.out.println ("log after method") ؛ }}<؟ xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/Aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd "> <bean id =" helloworldimpl1 "/> <bean id =" helloworldimpl2 "/> <bean id =" handler time-id = "loghandler"/> aop: config> order = "1"> <aop: pointcut id = "addtime" expression = "execution (* com.xrq.aop.helloworld.* (..))" /> <aop: قبل method = "printtime" pointcut-ref = "addtime" /> <aop: بعد method = "printtime" pointcut-ref = ref = "loghandler" order = "2"> <aop: pointcut id = "printlog" expression = "execution (* com.xrq.aop.helloworld. </aop: config> </bans>
لا تزال فئة الاختبار دون تغيير ، والنتيجة المطبوعة هي:
CurrentTime = 1446130273734log قبل MotherEnter HelloWorldImpl1.Printhelloworld () سجل بعد methodCurrentTime = 1446130273735CurrentTime = 1446130273736Log قبل motherenter helloworldimpl1.doprint 1446130273736Log قبل methodenter helloworldimpl2
هناك طريقتان لاستخدام loghandler قبل time -handler:
(1) هناك سمة طلب في الجانب ، وعدد سمة الطلب هو ترتيب تقاطع نقاط التركيز
(2) حدد loghandler قبل time -Handler. يستخدم Spring ترتيب تعريف الجانب كأمر النسيج بشكل افتراضي.
2. أريد فقط نسج بعض الطرق في الواجهة
مجرد تعديل تعبير نقطة:
<؟ xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/Aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd "> <bean id =" helloworldimpl1 "/> <bean id =" helloworldimpl2 "/> <bean id =" handler time-id = "loghandler"/> aop: config> order = "1"> <aop: pointcut id = "addtime" expression = "execution (* com.xrq.aop.helloworld.print* (..))" /> <aop: قبل method = "printtime" pointcut-ref = "addtime" /> <aOP: بعد الأسلوب = printtime "pointcut-ref =" ref = "loghandler" order = "2"> <aop: pointcut id = "printlog" expression = "execution (* com.xrq.aop.helloworld.do* (..))" /> <aOP: قبل method = "logbefore" pointcut-ref = "printlog" /> <aop: after method = "logafter" </aop: config> </bans>
وهذا يعني أن HimeDherler لن ينسج سوى طرق تبدأ في بداية طباعة واجهة HelloWorld ، لن ينسج Loghandler طرقًا تبدأ إلا في بداية واجهة HelloWorld
3. إجبار cglib على توليد الوكيل
كما ذكرنا سابقًا ، يستخدم Spring الوكيل الديناميكي أو CGLIB لإنشاء الوكيل. ستختار الإصدارات العليا من الربيع تلقائيًا ما إذا كنت تريد استخدام الوكيل الديناميكي أو CGLIB لإنشاء محتوى وكيل. بالطبع ، يمكننا أيضًا إجبار CGLIB على توليد الوكيل ، أي أن هناك سمة "فئة الوكيل المستهدفة" في <aop: config>. إذا تم تعيين قيمة السمة هذه على TRUE ، فستعمل الوكيل المستند إلى الفصل. إذا تم تعيين فئة الهدف بالوكالة على خطأ أو تم حذف هذه السمة ، فسيعمل الوكيل المستند إلى الواجهة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.