AOP أعتقد أن الجميع واضحون جدًا. في بعض الأحيان نحتاج إلى معالجة بعض سجلات الطلبات ، أو مراقبة بعض الطرق ، وما الذي يجب معالجته إذا كانت هناك استثناءات؟ الآن ، نقدم AOP من SPRING-BOOT.
[بيئة التطوير: رقم إصدار JDK هو 1.8 ، الربيع
عدد إصدار التمهيد هو 1.4.1] {style = "colorde-color:#ff0000"}
أولاً ، سنقدم حزمة الجرة أولاً.
تتم إضافة ملف POM على النحو التالي:
<!-استشهد AOP-> <rempency> <roupiD> org.springframework.boot </groupId> <Stifactid> spring-boot-starter-aop </stifactid> </repensid> <!-cite gson ، for printing-> <sependency> <splect> 2.7 </version> </premency>
بعد تقديم حزمة JAR ، نضيف طريقتين بسيطتين لمعالجة الطلبات لبدء التشغيل:
springbootapplication (scanbasepackages = {"com"})@restControllerPublic class demoapplication {public static void main (string [] args) {springapplication.run (demoapplication.class ، args) ؛ }. uservo.setage ("23") ؛ uservo.setname ("He Xiaowu") ؛ uservo.setsex ("ذكر") ؛ إعادة Uservo ؛ }. uservo.setname (name) ؛ uservo.setage (العمر) ؛ uservo.setsex (الجنس) ؛ إعادة Uservo ؛ }بعد إضافة طريقتين بسيطتين لمعالجة الطلب ، دعنا نضيف AOP لدينا
/** * اسم المشروع: springbootdemo * المبدع: He Xiaowu * وقت الإنشاء: 16/12/4 7:05 PM * اسم الفئة: SideDemo * وصف الفئة: * /// DECLARE هو قسم@SABNE // DECLARE هو BEAN MADINGENT@COMPONENT@1) SIDEDEMO {private logger. Private GSON GSON = New GSON () ؛ // إعلان نقطة في التنفيذ التعبير @pointcut ("التنفيذ (public * com.example.demoapplication. * (..))") private void controleraspect () {} // طباعة المحتوى قبل طلب method @fore (value = "controlerAspect () (servletRequestatTributes) requestContextholder.getRequestatTributes () ؛ httpservletrequest request = requestAttributes.getRequest () ؛ // اطبع محتوى الطلب log.info ("====================================================== =============================================================== =============================================================== =============================================================== =============================================================== =============================================================== =============================================================== =============================================================== // طباعة محتوى الإرجاع بعد تنفيذ الطريقة apterReturning (returning = "o" ، pointcut = "controlerAspect ()) Log.info ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------بعد تكوين الاثنين ، نطلب ثم عرض سجل الطباعة. أولاً ، ابدأ الحاوية الخاصة بنا ، ثم نطلب أولاً طريقة المعالجة المعلمة. سجل الطباعة كما يلي:
{width = "1232"
الارتفاع = "132"}
يمكن العثور على أن عنوان URL المطلوب ، والطريقة ، وقيم المعلمة ARGS ، والأنواع ، والمحتوى الذي تم إرجاعه يتم طباعته جميعًا ، مما يشير إلى أن هذا هو اعتراض AOP بنجاح.
بعد ذلك ، نختبر طريقة معالجة الطلب بدون معلمات ، وطباعة السجل على النحو التالي:
{width = "1100"
الارتفاع = "130"}
يمكننا أن نجد أن معلمات الطريقة المطبوعة في هذه الطريقة هي صفيف فارغ لأن الطريقة لا تتطلب مرور المعلمة.
ما سبق هو SPRINGBOOT المراجع AOP لمعالجة سجل معالجة الويب. فيما يلي بعض التعليقات التوضيحية الرئيسية لأقسام AOP. فيما يلي مجرد أوصاف واستخدام التعليقات التوضيحية. لن يختبرها المؤلف بالتفصيل. إذا كنت مهتمًا ، يمكنك اختبارها بنفسك:
شرح الفصل:
يعرّف Aspect فئة على أنها فئة من الجوانب
@order (i) يمثل أولوية المعالجة لفئة الوجه. كلما كانت القيمة I أصغر ، كلما ارتفع مستوى الأولوية. ملاحظة: يمكنك التعليق على الفصل أو التعليق على الطريقة.
توضيح الطريقة:
يحدد @pointcut طريقة كقطعة نقاط كتعبير ، والتفاصيل التالية
Before ينفذ الطريقة قبل نقطة الظل ، المحتوى هو نقطة الظل المحددة
يتم تنفيذ After بعد قطع النقطة ، قبل العودة ،
يتم تنفيذ AfterReturning بعد نقطة الدخول والعودة. إذا كنت ترغب في معالجة معلمات الإرجاع لبعض الطرق ، فيمكنك تشغيلها هنا.
around يحيط بنقطة الظل ، وتنفيذ قبل الدخول إلى نقطة الظل ، وبعد نقطة الظل
AfterThrowring يلقي استثناء بعد نقطة الشق للمعالجة
@order (i) يمثل أولوية قطع النقطة. كلما كانت الأول أصغر ، كلما زادت الأولوية
مجموعة التعليقات التوضيحية @pointcut:
في الكود أعلاه ، نحدد نقطة الظل التي تعالج المسار المحدد فقط:
@pointcut ("التنفيذ (public * com.example.demoapplication. * (..))") private void controlerAspect () {}الآن ، نحن نحدد نقطة الظل للتعامل مع المسارات الأخرى:
@pointcut ("التنفيذ (public*com.demo.*.*(..))") private void controlerdemo () {}تتم معالجة جميع نقاط الظل أعلاه بشكل منفصل. إذا كنا بحاجة إلى نقطة الظل لمعالجة كلاهما ، فيمكننا تكوينها على هذا النحو:
@pointcut (value = "controlerAspect () || controllerDemo ()") private void all () {} في شرح @بوينتكوت ، الرجوع مباشرة إلى أسماء الأسلوب الأخرى المشروحة بواسطة @pointcut ، بحيث يمكن لقطع النقطة التعامل مع الأساليب تحت مسارين
@pointcut التعليق التوضيحي التعبير: public*com.demo.*.*(..)
يمكن للمعدل العام الأول الذي يمثل استخدام طريقة * بدلاً من الأول * لتمثيل قيمة الإرجاع ، و * يمثل الجميع
com.demo.* Package Path ،.* يمثل الحزمة الثالثة في المسار.* يمثل طرق جميع الفئات تحت جميع الحزم تحت المسار.
(..) تعني معلمات طريقة غير محدودة
بعض الملاحظات حول order (i) التعليق التوضيحي:
فئة التعليقات التوضيحية ، وأصغر القيمة ، وأعلى الأولوية ، وطريقة التعليقات التوضيحية ، يتم شرح التعليقات التوضيحية: @قبل ، كلما كانت القيمة I أصغر ، كلما زادت الأولوية ، كلما زادت الأولوية ، كلما زادت شرحها: @After أو AfterReturning ، زادت قيمة I ، وارتفاع الأولوية.
لتلخيص الاثنين ، هو:
في العملية قبل نقطة الدخول ، يتم تنفيذ العملية بعد نقطة الدخول بواسطة قيمة الطلب من صغيرة إلى كبيرة ، ويتم إجراء العملية بعد نقطة الدخول بواسطة قيمة الطلب من كبيرة إلى صغيرة
يمتد:
قد يسأل بعض القراء ، إذا كنت أرغب في طباعة الوقت اللازم للطلب من الواردة والانتهاء ، وتحديد متغير عضو لحساب الوقت ، وإعطاء الوصول إلى @AfterReturning ، قد تكون هناك مشاكل المزامنة. لذلك نشير إلى كائن threadlocal الذي يحدد النوع العام. إن وقت تسجيل الطلب في @قبل وخصم السجل في AfterReturning هو الوقت المستهلك. الرمز كما يلي:
/** * اسم المشروع: springbootdemo * المبدع: He Xiaowu * وقت الخلق: 16/12/4 7:05 PM * اسم الفصل: SideDemo * الوصف: * /// الإعلان هو قسم@SABKY // DECLARATION هو عبارة Private GSON GSON = New GSON () ؛ threadlocal <long> startTime = new threadlocal <Brong> () ؛ // إعلان نقطة في التعبير exply exploy @pointcut ("التنفيذ (public * com.example.demoapplication. * (..))") private void controleraspect () {} // طباعة المحتوى قبل طلب method @before (value = "controleraspect () servletRequestAttributes requestAtTributes = (servletRequestAtTributes) requestContextholder.getRequestatTributes () ؛ httpservletrequest request = requestAttributes.getRequest () ؛ // اطبع محتوى الطلب log.info ("=============================================================================================================================================== ======================================================== ========================================================== ======================================================== ========================================================== ========================================================== ========================================================== Arrays.ToString (JoinPoint.getArgs ())) ؛ log.info ("====================================================================================================================================== Arrays.ToString (JoinPoint.getArgs ())) ؛ log.info ("محتوى الاستجابة:" + gson.tojson (o)) ؛ Log.info ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ما ورد أعلاه كل النتائج التي تم الحصول عليها من خلال الاختبار. قد تكون هناك اختلافات أو أخطاء. من فضلك صحح لي.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.