1. الخلفية
في الآونة الأخيرة ، نظرًا لمشكلات مسح حزمة المشروع ، خلال عملية حل المشكلة ، اكتشفت بطريق الخطأ أن Spring و SpringMVC لهما علاقة حاوية الوالدين والطفل ، ويرجع ذلك بالتحديد إلى أن مشكلة مسح الحزمة تحدث غالبًا. نحن هنا نحلل ونفهم علاقة حاوية الوالدين والطفل بين Spring و SpringMVC ونقدم الطريقة الرسمية الموصى بها لمسح الحزمة في ملفات تكوين الربيع و springMVC.
2. فهم المفهوم والمعرفة وضع الأساس
في المفهوم الأساسي للإطار العام لـ Spring ، تعد الحاويات هي الفكرة الأساسية ، والتي تستخدم لإدارة دورة حياة الفول بأكملها. في المشروع ، لا يوجد بالضرورة حاوية واحدة فقط. يمكن أن يشتمل الربيع على حاويات متعددة ، والحاوية لها مستويات أعلى وأسفل. السيناريو الأكثر شيوعًا في الوقت الحالي هو تقديم أطرتي Spring و SpringMVC في المشروع. ثم هو في الواقع حاوية. الربيع عبارة عن حاوية أولياء الأمور و springmvc هي حاوية طفلها. يمكن مرئي الحاوية المسجلة في حاوية الأصل الربيع إلى حاوية springmvc ، في حين أن الحبة المسجلة في حاوية springMVC غير مرئية لحاوية الأصل الربيع ، أي أن الحاوية الفرعية يمكنها رؤية الفاصوليا المسجلة في الحاوية الأصل ، وإلا فلن تعمل.
يمكننا استخدام تكوين التعليقات التوضيحية الموحدة على النحو التالي لتسجيل BATCH ، دون تكوين كل فول باستخدام XML بشكل منفصل.
<السياق: مكون المسح الضوئي package = "com.hafiz.www" />
من الدليل المرجعي الذي يوفره الربيع ، نعلم أن وظيفة هذا التكوين هي مسح جميع الفئات ضمن حزمة الحزمة الأساسية المكونة التي تستخدم التعليق التوضيحي @Component ، وتسجيلها تلقائيًا في الحاوية. في الوقت نفسه ، يقومون أيضًا بمسح التعليقات التوضيحية الثلاثة لـ Controller و service و @despository لأنها موروثة من component.
في المشروع ، غالبًا ما نرى التكوين التالي. في الواقع ، مع التكوين أعلاه ، يمكن حذف هذا ، لأن التكوين أعلاه سيقوم بتشغيل التكوين التالي افتراضيًا. سيعلن التكوين التالي عن التعليقات التوضيحية مثل required ، @autowired ، postconstruct ، persistenceContext ، resource ، predestroy ، إلخ.
<السياق: التعليق التوضيحي-config/>
بالإضافة إلى ذلك ، هناك تكوين آخر يتعلق بـ SpringMVC. بعد التحقق ، يجب تكوين هذا لـ springMVC لأنه يعلن requestmapping ، requestbody ، responseBody ، إلخ.
<MVC: تعليقات التعليقات التوضيحية />
إصدار تكوين الجملة أعلاه قبل Spring 3.1 يعادل طريقة التكوين التالية
<!-تكوين Mapper Contentation Controller Mapper ، يتم استخدامه في SpringMVC لتعيين عنوان URL طلب الطلب إلى وحدة تحكم محددة-> <bean/> <!-تكوين خريطة وحدة تحكم التعليقات التوضيحية ، يتم استخدامه في springMVC لتعيين طلبات محددة لطريقة محددة-> <bean/>
الإصدار بعد Spring3.1 يعادل طرق التكوين التالية
<!-تكوين Mapper Contentation Controller Mapper ، يتم استخدامه في SpringMVC لتعيين عنوان URL طلب الطلب إلى وحدة تحكم محددة-> <bean/> <!-تكوين خريطة وحدة تحكم التعليقات التوضيحية ، يتم استخدامه في springMVC لتعيين طلبات محددة لطريقة محددة-> <bean/>
3. تحليل سيناريو محدد
دعونا نلقي نظرة فاحصة على أسباب تعارض الحاوية بين الربيع و springMVC؟
لدينا حاويتان ، Spring و SpringMVC ، وملفات التكوين الخاصة بهم هي ApplicationContext.xml و ApplicationContext-MVC.XML على التوالي.
1. <سياق: مكون المسح الضوئي package = "com.hafiz.www" /> تم تكوينه في ApplicationContext.xml ليكون مسؤولاً عن مسح جميع الفاصوليا التي تحتاج إلى تسجيلها.
2. تكوين <MVC: تعليقه /> في ApplicationContext-mvc.xml ليكون مسؤولاً عن استخدام التعليقات التوضيحية المتعلقة بـ SpringMVC.
3. عند بدء المشروع ، وجدنا أن springMVC لا يمكن القفز. قمنا بتعيين مستوى طباعة السجل للسجل للتصحيح لتصحيح الأخطاء. لقد وجدنا أن الطلبات في حاوية springmvc لا يبدو أنها تم تعيينها إلى وحدة التحكم المحددة.
4. تكوين <Context: Component-Scan Base-Package = "com.hafiz.www" /> في ApplicationContext-Mvc.xml. بعد إعادة التشغيل ، يكون التحقق ناجحًا وقفز SpringMVC.
دعنا نتحقق من السبب المحدد ، وننظر إلى الرمز المصدر ، وابدأ من SPRINGMVC's DisterServlet للبحث. لقد وجدنا أنه عند تهيئة SpringMVC ، سنبحث عن جميع الفاصوليا في حاوية springMVC التي تستخدم تعليق توضيحي controller لتحديد ما إذا كان معالجًا أم لا. يجعل التكوين المكون من خطوتين من 1 و 2 حاوية springmvc الحالية لا تسجل الفول بتعليقات التعليق التوضيحي controller ، ولكن يتم تسجيل جميع الفاصوليا مع التعليق التوضيحي controller في حاوية الأصل في الربيع ، لذلك لا يمكن لـ SpringMVC العثور على المعالج ولا يمكن القفز. رمز المصدر الأساسي كما يلي:
void المحمي inithandlermethods () {if (logger.isdebugenabled ()) {logger.debug ("البحث عن تعيينات الطلب في سياق التطبيق:" + getApplicationContext ()) ؛ } String [] Beannames = (this.detectHandlerMethodsinancestorContexts؟ beanfactoryutils.beannamesfortypeIncludeDedanCestors (getApplicationContext () ، object.class): getApplicationContext (). لـ (string beanname: beannames) {if (isHandler (getApplicationContext (). gettype (beanname)))) }} معالجتها (gethandlermethods ()) ؛في طريقة Ishandler ، سنحدد ما إذا كان تعليق توضيح الفول الحالي هو وحدة تحكم. رمز المصدر كما يلي:
Ishandler Boolean المحمي (الفئة <؟> beantype) {return annotationutils.findannotation (beantype ، controller.class)! = null ؛}في تكوين الخطوة الرابعة ، يتم تسجيل جميع الفاصوليا مع شرح Controller أيضًا في حاوية SpringMVC ، لذلك يمكن لـ SpringMVC العثور على المعالج للمعالجة ، لذلك يقفز بشكل طبيعي.
لقد وجدنا سبب عدم قدرتها على القفز بشكل صحيح ، فما هو حلها؟
لاحظنا أنه في طريقة Inithandlermethods () ، DetectHandlerMethodsinancestorContexts ، فإنه يتحكم بشكل رئيسي في الفاصوليا في الحاوية وما إذا كانت الحاوية الأصل مضمنة. لا يتم تضمينه بشكل افتراضي. وبالتالي فإن الحل هو تكوين خاصية DetectHandlerMethodSinancEstorContexts من معالجة المعالجة إلى True في ملف تكوين springmvc (هنا تحتاج إلى معرفة أي نوع من معالجات يستخدم وفقًا للمشروع المحدد) ، حتى يتمكن من اكتشاف حبة الحاوية الأم. على النحو التالي:
<Bean> <property name = "detectHandlerMethodSinancestorContexts"> <value> true </value> </splense> </ban>
ومع ذلك ، في المشاريع الفعلية ، سيكون هناك العديد من التكوينات. نقوم بتقسيم أنواع مختلفة من الفاصوليا في حاويات مختلفة وفقًا للتوصيات الرسمية وفقًا للوحدات التجارية المختلفة: إن حاوية الوالدين الربيعية هي المسؤولة عن تسجيل جميع الفاصوليا الأخرى التي لم يتم شرحها بواسطة controller ، في حين أن SpringMVC مسؤول فقط عن تسجيل الحدود بين الفاصوليا المشرقة من قبل controller ، بحيث يتحمل كل منها مسؤولياتها الخاصة وتوضيحها. طريقة التكوين كما يلي
1. التكوين في ApplicationContext.xml:
<!-سجل الفاصوليا في حاويات الربيع التي لم يتم شرحها بواسطة controller-> <السياق: مكون المسح الضوئي-"com.hafiz.www"> <context: type-filter type = "annotation" expression = "org.springframework.steretype.Controller"/>/context:
2. التكوين في ApplicationContext-MVC.XML
<!-يتم تسجيل الفاصوليا فقط مع stroller enoation في حاوية springmvc-> <السياق: مكون المستحضر الأساسي = "com.hafiz.www" use-default-filters = "false"> <contex
3. ملخص
وبهذه الطريقة ، بعد أن نفهمنا علاقة حاوية الوالدين والطفل بين الربيع و springMVC ومبدأ المسح والتسجيل ، وفقًا للاقتراحات الرسمية ، يمكننا تخصيص أنواع مختلفة من الفاصوليا إلى حاويات مختلفة للإدارة. إذا كانت هناك مشاكل مثل الفول ، فلا يمكن إعادة توجيه SpringMVC ، وفشل تكوين المعاملة ، يمكننا تحديد موقع المشكلة بسرعة وحلها. سعيد جدا ، هل هناك أي ~
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.