تحلل هذه المقالة بشكل أساسي مفهوم تصميم بنية العظام لإطار الربيع لإطار الربيع. لماذا تحتاج هذه المكونات إلى هذه المكونات؟ كيف يجمعون معًا لتشكيل بنية الهيكل العظمي في الربيع؟ كيف تستخدم ميزة AOP الخاصة بـ Spring هذه الهيكل العظمي الأساسي للعمل؟ ما نوع نماذج التصميم المستخدمة في الربيع لإكمال هذا التصميم؟ ما هو مصدر إلهام مفهوم التصميم هذا لتصميم البرمجيات المستقبلية لدينا؟ سوف تجيب هذه المقالة على هذه الأسئلة بالتفصيل.
العمارة الهيكلية الربيع
هناك أكثر من عشرة مكونات في الربيع ، ولكن لا يوجد سوى عدد قليل من المكونات الأساسية.
الشكل 1. مخطط العمارة الكلي لإطار هذا الإطار
يمكن أن نرى من الشكل أعلاه أن هناك ثلاثة مكونات أساسية فقط في إطار الربيع: Core ، السياق ، والفاصوليا. يبنون بنية الهيكل العظمي الربيعي بأكمله. بدونهم ، من المستحيل أن يكون لديك خصائص الطبقات العليا مثل AOP و Web. أدناه سوف تحليل الربيع بشكل رئيسي من هذه المكونات الثلاثة.
مفهوم تصميم الربيع
كما ذكرنا سابقًا ، يتم تقديم المكونات الأساسية الثلاثة في الربيع. الفول هو بطل الرواية الحقيقي في الربيع.
يشبه دور الربيع معنى الكائن إلى OOP. تماما مثل مرحلة الأداء ، ولكن لا توجد ممثلين. لماذا يتم تحديد الدور في الربيع؟ يدير ملف التكوين ، وهو آلية حقن التبعية. ويتم إدارة علاقة الحقن هذه في حاوية IOC ، ثم ما هو كائن حاوية IOC ملفوفة بواسطة الفول. الربيع هو الغرض من إدارة هذه الكائنات وبعض العمليات الإضافية عن طريق تعبئة الكائنات في الفول.
تشبه استراتيجية التصميم تمامًا مفهوم Java لتنفيذ OOP. هذه البيئة في هذه البيئة وفقًا لقواعد معينة. بالتفكير في الأمر ، فكر في الأطر الأخرى التي نستخدمها في مفهوم تصميم كبير مماثل.
كيفية العمل مع المكونات الأساسية
كما ذكرنا سابقًا ، يعتبر Bean عاملًا رئيسيًا في الربيع. إذا كنت ممثلًا في الأداء ، فإن السياق هو الخلفية المرحلة لهذا الأداء ، وينبغي أن يكون Core هو الدعائم للأداء. فقط عندما يكونون معا ، يمكن أن يكون لديهم حالة أساسية يمكن أن تؤدي عرضًا جيدًا. بالطبع ، لا يمكن للظروف الأساسية أن تجعل هذا الأداء يبرز ، والمعرض الذي يقوم به مثير بما فيه الكفاية.
نعلم أن Bean يتم تعبئته ، ويجب أن يكون للكائن بيانات. لهم وللحفاظ على هذه العلاقة. لذا فإن السياق عبارة عن مجموعة من العلاقة بين الحاويات. إذن ما هو استخدام المكون الأساسي؟ في الواقع ، هناك بعض الأعمدة المطلوبة للعلاقة بين كل فول لاكتشاف العلاقة بين كل من المنظور وإنشائها.
يمكن تمثيلها بالرقم أدناه:
الشكل 2. ثلاث علاقات مكون
شرح مفصل للمكونات الأساسية
سنقدم هنا العلاقات الهرمية لكل مكون بالتفصيل ، وكذلك ترتيب الطلب في وقت التشغيل. يجب أن نولي اهتماما لاستخدام الربيع.
مكون الفول
تم شرح أهمية مكون الفول في الربيع في وقت سابق. يتم تعبئة مكونات الفاصوليا تحت org.springframework.beans. جميع الفئات الموجودة تحت هذه الحزمة تحل ثلاثة أشياء: تعريف بين ، إنشاء الفول ، وتحليل الفول. بالنسبة لمستخدمي الربيع ، فإن الشيء الوحيد الذي يحتاج إلى رعاية هو إنشاء الفول.
تم إنشاء نموذج مصنع Springbean.
الشكل 4. علاقة الميراث من مصنع Thebean
يحتوي Beanfactory على ثلاث فئات فرعية: ListableBeanfactory و HierarchicalBeanfactory و AutoWire Aptain Bean Factory. ولكن من الشكل أعلاه ، يمكننا أن نجد أن فئة التنفيذ الافتراضية النهائية هي DefaultListableBeanFactory ، ويقوم بتنفيذ جميع الواجهات. فلماذا تحدد العديد من مستويات الواجهات؟ تحقق من رمز المصدر وتعليمات هذه الواجهات. عملية التشغيل. على سبيل المثال ، تشير واجهة ListableBeanfactory إلى أن هذه الفاصوليا قابلة للسرقة ، وأن هرمي beanfactory تعني أن هذه الفاصوليا لها علاقات الميراث ، أي أن كل فول قد يكون له حبة أب. تحدد واجهة AutoWireCableBeanfactory قواعد التجميع التلقائية في Bean. تحدد هذه الواجهات الأربعة بشكل مشترك مجموعة الفول ، والعلاقة بين الفول ، وسلوك الفول.
يتضمن تعريف Bean بشكل أساسي وصف BeanDefinition.
الشكل 5.
تعريف Bean هو وصف كامل لجميع المعلومات في العقد التي حددتها في ملف التكوين في الربيع ، بما في ذلك مختلف الأدوات الفرعية. عندما نجح Spring في تحليل العقدة التي حددتها ، تم تحويله إلى كائن Beandefinition داخل الربيع. سيتم إجراء جميع العمليات لهذا الكائن في المستقبل.
عملية تحليل Bean معقدة للغاية ، وتتم تقسيم الوظيفة إلى تفاصيل ، لأن هناك العديد من الأماكن التي يجب تمديدها هنا ، ويجب أن تضمن مرونة كافية للتعامل مع التغييرات المحتملة. تحليل Bean هو أساسا لتحليل ملف تكوين الربيع. يتم إكمال عملية التحليل هذه بشكل أساسي من خلال الفصل في الشكل أدناه:
الشكل 6. فئة Bebean التحليلية
بالطبع ، هناك أيضًا تحليل محدد للعلامة.
مكون السياق
يتم تعبئة السياق تحت org.springframework. دعونا نلقي نظرة على كيفية بناء هذه البيئة.
Application Context هو فئة الأصل العليا للسياق. فيما يلي مخطط بنية السياق:
الشكل.
يمكن ملاحظة من الشكل أعلاه أن ApplicationsContext يرث Beanfactory ، مما يدل أيضًا على أن الكائن الرئيسي لحاوية الزنبرك هو الفاصوليا.
تشمل الفئات الفرعية من ApplicationContext بشكل أساسي جانبين:
يشير ConfiguRableApplicationContext إلى أن السياق يتم تعديله ، يمكن للمستخدم إضافة أو تعديل معلومات التكوين الموجودة في السياق.
WebapplicationContex هو اسم الاسم ، وهو السياق الذي تم إعداده للويب.
ثم تتمثل الفرعية في بناء نوع السياق ، متبوعًا بالطريقة للوصول إلى السياق. يشكل هذا المستوى الأول مستوى المستوى الكامل مستوى السياق.
بشكل عام ، يجب أن يكمل ApplicationContext ما يلي:
◆ اصنع بيئة تطبيق
◆ استخدم Beanfactory لإنشاء كائن الفول
◆ حفظ جدول علاقة الكائن
◆ يمكن التقاط الأحداث المختلفة
كحاوية IOC الربيعية ، يدمج السياق بشكل أساسي معظم ميزات Spring ، أو أساس معظم الميزات.
مكون أساسي
المكونات الأساسية ، باعتبارها المكون الأساسي في الربيع ، تحتوي على الكثير من الفئات الرئيسية. هذه الطريقة لتجريد جميع الموارد في واجهة تستحق التعلم في التصميم المستقبلي. دعونا نلقي نظرة على دور هذا الجزء في الربيع.
الشكل أدناه هو الرسم البياني الهيكلي المتعلق بالمورد:
الشكل 8. الرسم التخطيطي للبنية الفئة المرتبطة
يمكن ملاحظة من الشكل أعلاه أن واجهة الموارد تغلف أنواع الموارد المحتملة المختلفة ، أي أن الفرق في نوع الملف محظور للمستخدمين. بالنسبة لمزود الموارد ، فإن كيفية تعبئة الموارد لأشخاص آخرين لاستخدامها هي أيضًا مشكلة. وبهذه الطريقة ، يمكن الحصول على جميع الموارد من خلال فئة InputStream ، وبالتالي فإن مزود الموارد محمية أيضًا. مشكلة أخرى هي أن مشكلة تحميل الموارد ، أي أن المحمل للموارد يجب أن يكون موحدًا من الشكل أعلاه ، يمكن أن يحمل الواجهة جميع الموارد ، وتنفيذه الافتراضي هو التفضيل.
دعونا نلقي نظرة على كيف أنشأ السياق والموارد علاقة؟ انظر أولاً إلى مخطط علاقتهم:
الشكل 9
كما يمكن رؤيته من الشكل أعلاه ، يعهد السياق بعمل التحميل والتحليل ووصف الموارد إلى فئة Resourtensolver لإكماله. هناك العديد من الطرق المماثلة للمكونات الأساسية.
كيف تعمل في حاوية IOC
كما ذكرنا سابقًا ، فإن بنية وترابط المكونات الأساسية ومكونات السياق.
كيفية إنشاء مصنع Beanfactory
كما هو موضح في الشكل 2 ، فإن حاوية IOC هي في الواقع شبكة علاقة بين المكونين الآخرين. المدخل المدمج في طريقة التحديث لفئة AbstractApplicationContext. رمز هذه الطريقة كما يلي:
قائمة 1.abstractapplicationContext.refresh
تحديث الفراغ العام () يلقي Beansexception ، {Synchronized (this.startupshutdownitor) السياق. معالجات الفاصوليا. الفئات الفرعية. Catch (Beansexception ex)تتمثل هذه الطريقة في إنشاء رمز كامل لعملية حاوية IOC بأكملها ، وفهم أن كل سطر من الكود في الداخل يفهم أساسًا مبادئ ووظائف معظم الربيع.
يحتوي هذا الرمز بشكل أساسي على مثل هذه الخطوات:
◆ بناء Beanfactory بالترتيب
◆ قد يكون الحدث مهتمًا بالتسجيل
◆ إنشاء كائن مثيل بين
◆ تشغيل الأحداث الاستماع إلى
أدناه مع تحليل التعليمات البرمجية لهذه العمليات.
الجملة الثانية والثالثة هي إنشاء وتكوين Beanfactory. هذا هو التحديث ، تحديث التكوين. فيما يلي رمز الطريقة لتحديث Beanfactory:
قائمة 2
refreshiped refreshiptive () {hasbeanfactory () ؛ ؛تدرك هذه الطريقة الطريقة المجردة لـ AbstractApplicationContext RefreshBeanfactory. لاحظ أن أنواع الكائنات الفاصلة لها مجموعة متنوعة من أنواع الكائنات. الكائن الأصلي لـ BeanFactory هو DefaultListableBeanfactory.
الشكل 10. DefaultListableBeanfactory فئة الرسم التخطيطي
بالإضافة إلى الفئة المرتبطة بالفاصولياء ، وجد أنه مرتبط أيضًا بتسجيل الفول. في طريقة RefreshBeanfactory ، هناك خط من التعريفات (BeanFactory) التي ستجد الإجابة. الحاويات.
يمكن تفسير هذه العملية في الخريطة المتسلسلة التالية:
الشكل 11. قم بإنشاء مقدمة الوقت من الفاصوليا
تحليل Bean وتسجيله كما يلي:
تين
بعد إنشاء Beanfactory ، أضف بعض فئات الأدوات التي تحتاجها الربيع نفسه.
يلعب رمز الخط الثلاثة التالي في الملخصية Context دورًا حيويًا في توسيع وظيفة الربيع. يُسمح بشكل أساسي بتعديل تكوين تكوين Beanfactory المدمج الآن. لذلك يمتدون جميعًا وظيفة الربيع ، لذلك يجب أن نتعلم استخدام هذا الجزء من استخدام الربيع.
من بينها ، في طريقة InvokebeanFactoryPostProcessors ، من الأساس الحصول على فئات فرعية لتنفيذ واجهة BeanfactoryPostProcessor. وتنفيذ طريقة postprocessBeanfactory الخاصة بها ، فإن بيان هذه الطريقة هو كما يلي:
قائمة 3.BeanFactoryPostProcessor.PostProcessBeanfactory
void postprocessbeanfactory (configurableListableBeanfactory Beanfactory) يلقي beansexception ؛
معلماتها هي Beanfactory ، مما يشير إلى أنه يمكن تعديله بواسطة Beanfactory. البيانات.
يمكن أن تحصل طريقة RecordBeanPostProcessors أيضًا على فئة فرعية من تعريف المستخدم لواجهة BeanPostProcessor وتنفيذها إلى متغير BeanPostProcessors في كائن Beanfactory. يتم الإعلان عن الطريقتين في المعالج بين الفاصوليا: يتم استخدام ما بعد المعالجة ، وتنفيذ ما بعد المعالجة لتنفيذها أثناء تهيئة كائن الفول. يمكن تنفيذ عمليات المستخدم المعرفة.
رمز السطر الأخير هو تسجيل تهيئة حدث المراقبة والمستمعين الآخرين للنظام.
كيفية إنشاء مثيل بين الفول وإنشاء شبكة العلاقة بين الفول
فيما يلي رمز Bean الذي تم تأسيسه ، والذي يبدأ باستخدام طريقة FinishBeanFactoryInitity.
قائمة 4.abstractapplicationContext.FinishBeanfactoryInitialization
Foid Finishbeantialization (ConfiguraListable Beanfactory) {// الكسول).يمكن العثور على أنه يمكن العثور على مثيل الفول في الفاصوليا. مدونة طريقة ما قبل initiatiatesingletons هي كما يلي:
قائمة 5.DefaultListableBeanfactory.preinstantialsingletons
PROPER PREAD PREINSTANTIATESENTONS () يلقي beansexception {if (this.logger.isinfoEnabled ()) {this.logger.info ("singletons مسبقًا في" ؛ هذا: هذا. BeanDefinitionNames) iseagerinit ؛ . ؛}}}}}}}}هناك حبة فاصلة مهمة للغاية. يمكن أن يحدد طريقة إنشاء كائن مثيل طالما تم تنفيذ طريقة getObject الخاصة به. ومع ذلك ، فإن كائن مثيل هذا الفول داخل الربيع هو المصنع. يتم الانتهاء من هدف الحصول على Factorybean نفسه مع وإكمال.
كيفية إنشاء كائن مثيل للفول وكيفية إنشاء مفتاح أساسي في العلاقة المرتبطة بين كائنات مثيل الفول ، ما يلي هو المخطط الانسيابي لهذه العملية.
الشكل 13. مخطط تدفق إنشاء مثيل
إذا كانت الفاصوليا العادية ، فإنه يخلق مثيله مباشرة ، من خلال استدعاء طريقة getBean. فيما يلي خريطة الوقت المتسلسل لإنشاء مثيل بين:
الشكل 14.
جزء مهم للغاية هو إنشاء العلاقة بين مثيلات كائن الفول.
الشكل 15. إنشاء علاقة كائن
نقطة التوسع في حاوية IOC
مشكلة أخرى هي كيفية جعل هذه الأشياء الفاصوليا لها تمديد معين ، أي يمكن إضافة بعض العمليات. إذن ما هي الامتدادات؟ كيف يطلق الربيع هذه الامتدادات؟
لحاوية IOC في الربيع ، هناك الكثير. BeanfactoryPostProcessor ، BeanpostProcessor. يتم استدعاؤها عند بناء كائنات Beanfactory وبناء الفاصوليا. هناك تهيئة وتصرف. يمكن للمستخدمين تنفيذ الطريقة المحددة في هذه الواجهات ، وسيقوم الربيع بالاتصال بهم في الوقت المناسب. آخر هو المصنع.
تعتمد نقاط التوسع هذه عادةً على إكمال مهامنا المحددة. . يمكنك استخدام الاستعارة التالية لشرح.
نقوم بمقارنة الحاوية IOC مع مربع واحد. ثم علاقتها المقابلة هي Beanfactory هي نموذج صنع الماكينة ، ووضع الكرة هو الفاصوليا ، وكرة وضع الكرة هي مثيل الفول. أين الإضافات المذكورة سابقًا؟ يتوافق BeanfactoryPostProcessor مع إنشاء نموذج الكرة ، وسيتاح لك الفرصة لإجراء تصحيح ، أي أنه يمكن أن يساعدك في تعديل وضع الكرة. تهيئة PirlitizingBean و DiscipableBean في بداية ونهاية نماذج الكرة ، ويمكنك إكمال بعض الاستعدادات وتنظيم أعمال. يتيح لك BeanpostProcessor إجراء تصحيحات مناسبة لوضع الكرة. أخيرًا ، هناك مصنع ، وهو نموذج كرة سحري. وضع الكرة هذا مسبقًا ، لكنك ستحدد شكله بالنسبة له. الكرات التي تريدها
كيفية استخدام حاوية IOC بالنسبة لي
المقدمة السابقة لعملية بناء حاوية الربيع ، ما الذي يمكن أن يفعله الربيع بالنسبة لنا ، وما الذي يمكن أن تفعله حاوية IOC في الربيع؟ يجب علينا أولاً إنشاء حاوية IOC باستخدام الربيع.
تقوم IOC بالفعل ببناء مكعب Rubik لك. فكيف نشارك؟ هذا ما قلته سابقًا لفهم بعض الامتدادات في الربيع ، ونغير السلوك المشترك للربيع من خلال تحقيق تلك النقاط الممتدة. أما بالنسبة لكيفية تحقيق نقطة التوسع للحصول على نتائج الشخصية التي نريدها ، فهناك العديد من الأمثلة في الربيع. تستخدم للرجوع إليها.
شرح مفصل لميزات AOP في الربيع
مبدأ تنفيذ الوكيل الديناميكي
لفهم AOP من Spring ، يجب فهم مبدأ الوكالة الديناميكية أولاً ، لأنه يتم تنفيذ AOP على أساس الوكيل الديناميكي. يجب أن يبدأ العامل الديناميكي بـ JDK نفسه.
يوجد فئة وكيل تحت حزمة JDK's Java.lang.reflet ، وهي مدخل فئة الوكالة. هيكل هذه الفئة:
الشكل 16. هيكل بنية بروكسي
من الصورة أعلاه ، الأربعة هي الأساليب العامة. الطريقة الأخيرة NewProxyInstance هي طريقة إنشاء كائنات وكيل. الكود المصدري لهذه الطريقة هو كما يلي:
قائمة 6.proxy.newproxyinstance
كائن ثابت عام NewProxyInstance (loader classloader ، class> [] واجهات ، invocatchhandler h) يلقي aluctalalagumentexception {if (h == null) {th row new NullPointerexception () ؛} class cl = getproxyclass (loader ، interfaces) ؛ = cl.getConstructor (constructorms) ؛ ) ؛} catch (InstantiationException e) {رمي الإنترنت الجديد (تتطلب هذه الطريقة ثلاثة معلمات: ClassLoader ، والتي يتم استخدامها لتحميل فئة Loader من فئة الوكيل. الواجهات هي تلك الواجهات التي سيتم تمثيلها. InvocationHandler ، يتم استخدامه لتنفيذ تشغيل المستخدمين الذين يتم تخصيصهم من قبل المستخدمين بالإضافة إلى الأساليب في واجهة الوكيل. يستدعي المستخدم الطريقة الهدف من الطريقة الفريدة المحددة في فئة InvacationHandler. سيتم شرح هذا بالتفصيل لاحقًا.
دعونا نرى كيف ينتج البروكسي فئة الوكيل. تم الكشف أدناه.
الشكل 17. إنشاء كائنات وكيل
في الواقع ، يمكن العثور عليها من الشكل أعلاه أن فئة العامل هي في طريقة enderateproxyclass من proxygenerator. يتم لف فئة البروكية تحت Sun.MISC.
إذا كانت هناك مثل هذه الواجهة ، على النحو التالي:
قائمة 7. فئة SimpleProxy
الواجهة العامة SimpleProxy {public void sizemethod1 () ؛هيكل الفصل الذي تم إنشاؤه بواسطة الوكيل هو كما يلي:
قائمة 8. $ proxy2 فئة
الطبقة العامة proxy2 يمتد إلى java.lang.Rang.Proxy SimpleProxy M3 ؛
ستستدعي الطريقة في هذه الفئة طريقة الاستدعاء الخاصة بـ InvocationHandler ، وستتوافق كل طريقة مع متغير خاصية. هذه هي الطريقة التي يتحقق بها الوكيل بأكمله.
كيفية تحقيق Springaop
من مبدأ الوكيل السابق ، نعلم أن الغرض من الوكيل هو أنه عندما يتم استدعاء الطريقة المستهدفة ، يمكننا تنفيذ طريقة الاستدعاء لفئة InvocationHandler ، لذا فإن كيفية عمل مقالة على InvocationHandler هي المفتاح لتنفيذ AOP .
تطبيق AOP Spring هو اتفاق للامتثال لتحالف AOP. في الوقت نفسه ، قام Spring بتوسيعه ، مضيفًا بعض الواجهات مثل PointCut و Travisor لجعلها أكثر مرونة.
فيما يلي مخطط فئة من الوكيل الديناميكي JDK:
الشكل 18. JDK مخطط فئة الوكيل الديناميكي
تُظهر الصورة أعلاه بوضوح الواجهة المحددة بواسطة تعريف تحالف AOP. دعنا نناقش كيف يوسع Spring Alliance.
قائمة 9. تكوين BERXY BEAN
<bean id = "testBeansingleton"> <property name = "proxyInterFaces "> <value> org.springframework.ap.framework.prototypettest $ testbean value> p roperty> <property name =" target "> ref local =" testbeantarget > ref> property> <property name = "singleton"> <value> trueValue> property> <property name = "interceptors"> <list> <value> testInterceptorValue> <Val UE> testInterceptor2Value> list> bean>
في التكوين ، راجع أن واجهة الوكيل قد تم تعيينها ، فإن فئة التنفيذ للواجهة هي الفئة المستهدفة ، ويتم استدعاء التقاطع قبل تنفيذ طريقة الهدف. جوهر
دعونا نرى كيف يكمل الربيع الوكيل وكيفية استدعاء المعترض.
كما ذكرنا سابقًا ، يحقق Spring AOP نقطة التوسع الخاصة به لإكمال هذه الميزة. بالطبع ، يجب إنشاء كائن الوكيل ديناميكيًا من خلال فئة الوكيل.
فيما يلي مخطط توقيت للكائن الوكيل الذي تم إنشاؤه بواسطة الربيع:
الشكل 19. ظهور كائن الكائن
بعد أن يقوم Spring بإنشاء كائن وكيل ، عند الاتصال بالطريقة على الكائن الهدف ، سيتم تمثيلك في طريقة استدعاء فئة InvocationHandler ، والتي تم شرحها مسبقًا. هنا تنفذ فئة JDKDynamicaOpproxy واجهة InvocationHandler.
دعنا نلقي نظرة على كيفية استدعاء Spring the Interceptor.
الشكل 20.SPRING يدعو التقاطع
ما سبق هو وكيل JDK Dynamic.
تحليل وضع التصميم في الربيع
هناك أيضًا العديد من أنماط التصميم المستخدمة في فصل الربيع ، مثل وضع المصنع ، ووضع الفردي ، ووضع القالب ، وما إلى ذلك ، في "بنية النظام ونموذج تصميم WebX Framework" ، "بنية نظام Tomcat وتحليل وضع الوضع" ، إنه هو تم تقديمه بالفعل. هنا نقدم بشكل أساسي وضع الوكالة ووضع الإستراتيجية.
وضع الوكيل
مبدأ وضع الوكيل
يتمثل وضع الوكيل في إنشاء كائن وكيل لكائن معين ، ويتحكم كائن الوكيل في المرجع إلى الكائن الأصلي ، ويمكن لإنشاء هذا الكائن الوكيل إضافة بعض العمليات الإضافية إلى الكائن الأصلي. فيما يلي هيكل وضع الوكيل:
الشكل 21. بنية وضع الوكيل
الموضوع: موضوع مجردة ، إنها واجهة لتحقيق الكائن الحقيقي لكائن الوكيل.
ProxySubject: بالإضافة إلى واجهة تعريف السمات المجردة ، يجب أن تعقد فئة الوكيل أيضًا مرجعًا لكائن الوكيل
RealSubject: فئة الوكيل هي الكائن الهدف.
كيفية تنفيذ وضع الوكيل في الربيع
يتم تحقيق وكيل JDK الديناميكي في الربيع AOP باستخدام تقنية وضع الوكالة. بالإضافة إلى واجهة كائن الوكيل في الربيع ، سيكون هناك أيضًا org.springframework.aop.springproxy و org.springframework.apork.advise. مُنشئ استخدام وضع الوكيل في الربيع هو كما يلي:
الشكل 22. يتم استخدام الرسم البياني الهيكلي لوضع الوكيل في الأسلاك
$ proxy هو كائن الوكيل الذي تم إنشاؤه ، والموضوع هو موضوع مجردة ، والكائن الوكيل هو الاحتفاظ بمرجع إلى الكائن الهدف من خلال InvocationHandler.
هيكل كائن وكيل حقيقي في الربيع هو كما يلي:
قائمة 10 بروكسي كائن $ proxy4
الطبقة العامة $ proxy4 يمتد java.lang.reflect.proxy org.springframework.ap.framework.protypetts $ testbean work.aop.springproxy org.springframework.aop.framework.advend العكس .Method M26; java.lang.reflect.Method M6; java.lang.reflect.method m28; java.lang.reflethod m14; java.lang. Reflect.method m12; java . Lang.reflet.Method M27; java.lang .reflect.method m11; java.lang.reflect.method m22; java.lang.reflect.Method m3; java.lang.reflect.Method java.lang.reflect. Method m4; java.lang.reflet.method m19; java .lang.reflect.Method M7; java.lang.reflet.method m15; java.lang.reflet.method m20; left.Method M10; java. LANG.Reflect.Method M1; java.lang.reflect.Method M17; java .lang.reflect.Method M21; java.lang.reflect.Method m0; ava.lang.reflet.method m24; int HashCode (); int indexof (org.SpringFramework.aop.advisor); int interxof (org.aopalliance. aip.advice); ject); java.lang.string tostring (); void sayhello (); void dosomething (); void dosometHing2 (); java.lang.class getProxiedIndIndIndIndIndIndIRFACES (); ProxytargetClass (); Org.SpringFramework.aop .advisor; getadvisors (); void addvisor (int, org.springframework.aip.advisor) Throws org.SpringFramework.aP.framework.aPConfigeXception; void addadvisor (ORG.Sprin gframework.aop.advisor) Throws org.SpringFramework.aop. framework.aPConfigeXception; void SetTargetsource (ORG .springframework.aop.targetsource); ORG.SpringFramework.aop.Targetsource GetTARGETSource (); d (); Boolean IsinterfaceProxied (java.lang.class); Boolean Removeadvisor (org.SpringFramework.aP. advisor );; Boolean SOR, ORG.SpringFramework.aP.Advisor) Throws org.SpringFramework.aop.framework.aPConfigeXception; void addAdvice (ORG.AOPALLIANCE.AOP.ADVICE) Throws org.SpringFramework.aP.framework.aPConfigexception; void addvice (int, org.aopalliance.aop.advic e) Throws org.Springframework.aP.framework.aPConfigeXception; .aop.advice); java.lang.string toproxyconfigstring (); Boolean isfrozen (); void setexposeProxy (Boolean);
策略模式
策略模式原理
策略模式顾名思义就是做某事的策略,这在编程上通常是指完成某个操作可能有多种方法,这些方法各有千秋,可能有不同的适应的场合,然而这些操作方法都有可能用到。各一个操作方法都当作一个实现策略,使用者可能根据需要选择合适的策略。
下面是策略模式的结构:
图23.策略模式的结构
Context:使用不同策略的环境,它可以根据自身的条件选择不同的策略实现类来完成所要的操作。它持有一个策略实例的引用。创建具体策略对象的方法也可以由他完成。
◆Strategy:抽象策略,定义每个策略都要实现的策略方法
◆ConcreteStrategy:具体策略实现类,实现抽象策略中定义的策略方法
◆Spring中策略模式的实现
◆Spring中策略模式使用有多个地方,如Bean定义对象的创建以及代理对象的创建等。这里主要看一下代理对象创建的策略模式的实现。
前面已经了解Spring的代理方式有两个Jdk动态代理和CGLIB代理。这两个代理方式的使用正是使用了策略模式。它的结构图如下所示:
图24.Spring中策略模式结构图
在上面结构图中与标准的策略模式结构稍微有点不同,这里抽象策略是AopProxy接口,Cglib2AopProxy和JdkDynamicAopProxy分别代表两种策略的实现方式,ProxyFactoryBean就是代表Context角色,它根据条件选择使用Jdk代理方式还是CGLIB方式,而另外三个类主要是来负责创建具体策略对象,ProxyFactoryBean是通过依赖的方法来关联具体策略对象的,它是通过调用策略对象的getProxy (ClassLoaderclassLoader)方法来完成操作。
总结
本文通过从Spring的几个核心组件入手,试图找出构建Spring框架的骨骼架构,进而分析Spring在设计的一些设计理念,是否从中找出一些好的设计思想,对我们以后程序设计能提供一些思路。接着再详细分析了Spring中是如何实现这些理念的,以及在设计模式上是如何使用的。