تقدم هذه المقالة كتابة AOP استنادًا إلى SPRING BOOT و JDK8 ، حيث تجمع بين التعليقات التوضيحية المخصصة لتحقيق التحقق من معلمة الواجهة الشائعة.
سبب
حاليًا ، تتمثل الطريقة الشائعة الاستخدام للتحقق من المعلمة في إضافة تعليقات توضيحية على فئة الكيان ، ولكن بالنسبة للطرق المختلفة ، تختلف قواعد التحقق المطبق أيضًا. على سبيل المثال ، هناك كيان حساب:
الفئة العامة حساب {اسم السلسلة الخاصة ؛ // اسم العصر الصحيح الخاص ؛ // عمر}لنفترض أن هناك عملًا: عندما يسجل المستخدم ، يحتاج هو أو هي إلى ملء اسمه ، وعندما يقوم المستخدم بتسجيل الدخول ، يحتاج أو هي فقط إلى ملء اسمه. ثم من غير المناسب إضافة قواعد التحقق إلى فئات الكيانات.
لذلك ، أردت دائمًا تنفيذ التحقق من المعلمة على مستوى الطريقة. يمكن أن تطبق الطرق المختلفة قواعد التحقق المختلفة لنفس معلمات الكيان ، والتي أنجبت هذه الأداة وتم استخدامها في العمل اليومي لفترة طويلة.
يقدم
دعونا نلقي نظرة على كيفية استخدامه أولاً:
servicepublic class testimpl تنفذ itestService {Override @check ({"name" ، "Age"})يشير التعليق التوضيحي @Check على الطريقة إلى أن الاسم والخصائص العمرية في حساب المعلمة لا يمكن أن يكون فارغًا. بالإضافة إلى التحقق غير الفارغ ، فإنه يدعم الحجم الحجم والتحقق من المساواة:
Check ({"id> = 8" ، "name! = aaa" ، "العنوان <10"})تقوم رسالة الخطأ الافتراضية بإرجاع الحقول ، وأسباب الخطأ والطرق المسمى ، مثل:
يجب ألا يولد UpdateUserId أثناء استدعاء testvalidid> = 8 أثناء استدعاء TestValidName يجب! = AAA أثناء استدعاء testvalid
يتم دعم معلومات إرجاع الخطأ المخصص أيضًا:
check ({"title <= 8: لا يتجاوز عدد أحرف العنوان 8 أحرف ، بما في ذلك علامات الترقيم"})فقط أضف: بعد قاعدة التحقق وكتابة معلومات مخصصة ، والتي ستحل محل رسالة الخطأ الافتراضية.
ملاحظة: المبدأ الأساسي هو الحصول على قيمة الحقل في كيان المعلمة من خلال التفكير ، ثم التحقق منه وفقًا للقواعد. لذلك ، يتم دعم الأساليب التي تحتوي على معلمة واحدة فقط ، ولا يمكن أن تكون المعلمات من النوع الأساسي.
يستخدم
كيفية استخدام AOP في SPRING-BOOT ، لن أخوض في التفاصيل هنا ، وأعرض بشكل أساسي الرمز الأساسي في AOP.
تبعيات مافن
بالإضافة إلى تبعيات Boot-Boot ، فإن التبعيات المطلوبة على الطرف الثالث ليست تبعية أساسية ، ويمكنك الاختيار وفقًا لعاداتك الشخصية:
<!-للتحقق من السلسلة-> <reperency> <roupiD> org.apache.commons </groupId> <StifactId> commons-lang3 </shintifactid> <الإصدار> 3.3.2 </sperive> </rependency> <!-للطباعة السجل-> <reperency> <roupled> org.slf4j </rougeid> <splect> 1.7.25 </version> </premeDency>
التعليقات التوضيحية المخصصة
استيراد java.lang.annotation.elementtype ؛ import java.lang.annotation.retention ؛ import java.lang.annotation.target ؛ استيراد java.lang.annotation.retention.rention.runtime */@target ({elementType.type ، elementType.method})@entry (RunTime) public interface check {// field rights ، التنسيق: اسم الحقل + قواعد التحقق من القولون + رسالة خطأ ، على سبيل المثال: معرف <10: يجب أن يكون المعرف أقل من 10 سلسلة () ؛}الكود الأساسي
من خلال اعتراض طريقة الواجهة مع التعليق التوضيحي check ، قم بإجراء التحقق من المعلمة قبل تنفيذ الطريقة. إذا كانت هناك رسالة خطأ ، فسيتم إرجاعها مباشرة:
AROUND (value = "@com.cipher.checker.check") // هنا تحتاج إلى التغيير إلى مسار التعليقات العامة المخصصة للتحقق من الكائنات العامة (proseingJoinpoint Point) رمي {Object obj ؛ // سلسلة التحقق من المعلمة msg = docheck (نقطة) ؛ if (! stringUtils.isempty (msg)) {// هنا يمكنك إرجاع فئة الإرجاع المغطاة بعرض جديد alfictalargumentException (msg) ؛ } obj = point.proceed () ؛ إرجاع OBJ ؛}طريقة التحقق الأساسية في طريقة DoCheck ، المبدأ الرئيسي هو الحصول على اسم الحقل وقواعد التحقق المحددة في التعليق التوضيحي ، والحصول على قيمة الحقل المقابل في كيان المعلمة من خلال الانعكاس ، ثم إجراء التحقق:
/*** التحقق من المعلمة** param pointsojoinpoint* @Return error message*/private string doCheck (proseingjoinpoin point) {// get get method complate value object [] ediuments = point.getargs () ؛ // الحصول على طريقة طريقة = getMethod (point) ؛ سلسلة methodInfo = stringUtils.isempty (method.getName ())؟ "": "أثناء الاتصال" + method.getName () ؛ سلسلة msg = "" ؛ if (isCheck (method ، minsitions)) {check annotation = method.getAnnotation (check.class) ؛ سلسلة [] الحقول = التعليق التوضيحي. value () ؛ كائن VO = وسيطات [0] ؛ if (vo == null) {msg = "param لا يمكن أن يكون فارغًا" ؛ } آخر {for (حقل السلسلة: الحقول) {// parsing fieldInfo info = desolvefield (field ، methodInfo) ؛ // احصل على قيمة قيمة كائن الحقل = ReflectionUtil.invokegetter (VO ، info.field) ؛ // تنفيذ قاعدة التحقق boolean isValid = info.optenum.fun.apply (القيمة ، info.operatornum) ؛ msg = isValid؟ MSG: info.innermsg ؛ }}} إرجاع msg ؛}يمكنك أن ترى أن المنطق الرئيسي هو:
حقول التحليل -> احصل على قيمة الحقول -> تنفيذ قواعد التحقق
يتم الحفاظ على فئة التعداد داخليًا ، ويتم تحديد عمليات التحقق ذات الصلة في ذلك:
/** * التشغيل enum */enum dorpator {/** * أكبر من */greater_than (">" ، checkparamaspect :: isgreaterthan) ،/** * أكبر من أو يساوي */greater_than_equal ("،" ، ishan) / *** أقل من أو يساوي* / less_than_equal ("<=" ، checkparamaspect :: islesshanequal) ، / *** لا يساوي* / not_equal ("! =" ، checkparamaspect :: isnotequal) ، / *** not فارغة* / not_null ("ليس null" ، checkparamevect :: isnotnull) ؛ قيمة السلسلة الخاصة ؛ ثنائيات خاصة <كائن ، سلسلة ، منطقية> متعة ؛ المشغل (قيمة السلسلة ، bifunction <object ، string ، boolean> fun) {this.value = value ؛ this.fun = متعة ؛ }} لأسباب المساحة ، لن أقوم بتوسيع جميع الرموز واحدة تلو الأخرى. يمكن للأصدقاء المهتمين الحصول على جميع رموز المصدر على العنوان التالي: ciphermagic/java-learn/sandbox/checker
تودو
في النهاية
شكرا لك على قراءتك. يمكن للأصدقاء الذين يحبونه أن يعجبهم على جيثب. إذا كان لديك أي أسئلة أو اقتراحات ، فيرجى ترك رسالة أدناه ونتطلع إلى ردك.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.