عندما نعمل على مشروع ، سنستخدم مستمعًا للحصول على ملفات تكوين الربيع ، ثم نخرج الفاصوليا التي نحتاجها منه. على سبيل المثال ، لجعل الموقع الرئيسي. على افتراض أن منطق أعمال الخلفية للمنتج يتم بشكل جيد ، نحتاج إلى إنشاء مستمع ، والاستعلام عن بيانات الصفحة الرئيسية في بدء تشغيل المشروع ووضعها في التطبيق ، أي طريقة استدعاء منطق أعمال المنتج الخلفية في المستمع ، أي أننا بحاجة إلى الحصول على الفاصوليا المقابلة التي تم تكوينها في الربيع في المستمع. قم بإنشاء المستمع أولاً:
1. إنشاء initdatalistener
إنشاء مستمع initDatalistener يرث servletContextRistener:
/** * description: TODO (يستخدم لتهيئة البيانات عند بدء تشغيل المشروع) * Author ESON_15 * */// @Component // المستمع هو مكون من طبقة الويب. يتم إنشاء مثيل له بواسطة Tomcat ، وليس على أساس من قبل الربيع. لا يمكن وضعه في فئة الربيع العامة في فصل الربيع initDatalistener تنفذ servletContextListener {private productervice productervice = null ؛وتكوين المستمع في web.xml:
كما ذكر أعلاه ، يتم تعريف بعض المنطق التجاري للمنتج في Productervice ، ويتم تسليم هذه المنتجات إلى الربيع للإدارة. فكيف نحصل على هذا الكائن؟ أول ما يجب أن نكون متأكدين هو: لا يمكننا الحصول عليها من قبل أنفسنا ، لأنه إذا خرج ، فإنه لا علاقة له بـ Spring's IOC ... هناك ثلاث طرق رئيسية لتحقيق ذلك. نقوم بتحليله واحدًا تلو الآخر ، وأخيراً نقارن المزايا والعيوب.
2. قم بتحميل ملف beans.xml مباشرة
هذه الطريقة بسيطة وخام. ألا تحتاج إلى تحميل ملف التكوين؟ حسنًا ، سأقوم بتحميله ، على النحو التالي:
//@component // المستمع هو مكون من طبقة الويب. يتم إنشاء مثيل له بواسطة Tomcat ، وليس الربيع. لا يمكن وضعها في فصل الربيع العام initDatalistener تنفذ servletContextListener {Private ProducterVice ProductService = null ؛ // ProductService يحدد منطق الأعمال المتعلق بـ Override public void contextDestRoyed (حدث ServletContextevent) {} Override public void contextinitialized (servletContexTevent Event) {// الحصول على تطبيق معلومات منتجات productervice query querer ProductService = (productervice) context.getBean ("productervice") ؛ System.out.println (ProductService) ؛ // الإخراج لمعرفة ما إذا كنت تحصل عليه // فيما يلي العمليات المتعلقة بـ Productervice ...}}هذه الطريقة جيدة تمامًا ، والفكرة واضحة للغاية. قم أولاً بتحميل Beans.xml ملف التكوين ثم احصل على الفول. ومع ذلك ، بعد بدء Tomcat ، دعونا نلقي نظرة على إخراج المعلومات من وحدة التحكم:
في هذه المرحلة ، يجب أن نجد عيوب هذه الطريقة. تم تحميل ملفات التكوين مرتين ، مما يعني أن تلك الفاصوليا تم إنشاء مثيل لها مرتين. انطلاقًا من المعلومات المطبوعة ، حصلنا على الفاصوليا التي قمنا بتحميل ملفات التكوين بأنفسنا وتم إنشاء مثيل لها. من الواضح أن هذه الطريقة غير مرغوب فيها.
3. احصل من ServletContext
من الطريقة أعلاه ، يمكننا على الأقل معرفة أن Spring قد قام بتحميل ملف التكوين مرة واحدة من خلال المستمع. لا نحتاج إلى تحميله مرة أخرى. من السهل التفكير في أنه إذا عرفنا أين تم تحميل الربيع ، فيمكننا الحصول على ملف التكوين من هناك. دعنا نلقي نظرة على عملية تحميل ملف التكوين في الربيع:
في الشكل أعلاه (تم حذف الكود غير ذي صلة) ، فإن ContextLoaderListener هو مستمع الربيع الذي قمنا بتكوينه في web.xml. كما أنه ينفذ ServletContextListener ويورث ContextLoader. في المستمع ، يتم الحصول على ملف التكوين بشكل رئيسي من خلال طريقة initWebApplicationContext وإنشاء كائن webapplicationContext. في طريقة initwebapplicationContext ، يتم تنفيذ شيئين رئيسيين: أحدهما هو الحصول على سياق الربيع ، والآخر هو وضع سياق الربيع في servletcontext ، والمفتاح هو: webapplicationContext.root_web_application_context_attribute. إذن كيف تحصل على سياق الربيع؟ إنه للحصول على مسار الربيع الذي تم تكوينه في web.xml. config_location_parm هو في الواقع ثابت سلسلة ، وهو مستمع Spring الذي تم تكوينه التالي في Web.xml:
<Context-param> <Param-name> contextConfigLocation </param-name> <!-config_location_parm هو contextConfigLocation-> <Param-value> classpath: beans.xml </parm-value> </sontext-param>
لذلك من الواضح أنك تحصل على beans.xml من خلال المسار الذي تم تكوينه في web.xml ، ثم قم بتحميل ملف التكوين هذا وتثبيت الحبة.
الآن بعد أن عرفنا أنه بعد تحميل Spring ملف التكوين ويضعه في ServletContext ، يمكننا الذهاب إلى هنا والحصول عليه مباشرة!
//@component // المستمع هو مكون من طبقة الويب. يتم إنشاء مثيل له بواسطة Tomcat ، وليس الربيع. لا يمكن وضعها في فصل الربيع العام initDatalistener تنفذ servletContextListener {Private ProducterVice ProductService = null ؛ Override public void contextDestRoyed (حدث ServletContexTevent) {// todo method method method method} override public void contextinitialized (ServletContexTevent حدث) {// الحصول على معلومات عن منتج Business Logic Query // cholution 2: عند بدء تشغيل ملف تكوين Spring من خلال Servlet و Servaned. نحن فقط بحاجة إلى الحصول عليها في servletcontext. ApplicationContext Context = (ApplicationContext) event.getServletContext () .getAttribute (webapplicationContext.root_web_application_context_attribute) ؛ ProductService = (productervice) context.getBean ("productervice") ؛ System.out.println (ProductService) ؛ }} وبهذه الطريقة ، يمكننا الحصول على كائن مستنزف لخدمة المنتجين. هذه الطريقة جيدة ، لكن المعلمات في getAttribute طويلة جدًا. لا أعرف ما إذا كانت جبين المبرمج قد تم قصها في ذلك الوقت. أعتقد أنه لا يستطيع التفكير في أسماء أخرى أكثر ملاءمة ~
4. التحميل من خلال فئة الأدوات التي توفرها Spring <Br /> ربما أدرك الرجال الكبار الذين طوروا Spring أيضًا أن اسم هذه المعلمة كان طويلًا جدًا ، لذلك قدموا فئة طريقة يمكنها تحميل ملف التكوين:
الطبقة العامة initDatalistener تنفذ servletContextListener {private productervice productervice = null ؛ Override public void contextDestroyed (حدث servletContexTevent) {// todo method method method adult} override public void contextInitialized (servletContextevent Event) {// get business query query query query context = webapplication context ProductService = (productervice) context.getBean ("productervice") ؛ System.out.println (ProductService) ؛ }} في الواقع ، فإن طريقة getWebPlicationContext هنا تغلف فقط الطريقة أعلاه. دعونا نلقي نظرة على الكود المصدري لهذه الطريقة:
public webapplicationContext getWebapplicationContext (servletcontext sc) {return getWebapplicationContext (sc ، webapplicationcontext.root_web_application_context_attribute) ؛ }هذا أكثر ملاءمة للمبرمجين للاتصال ، هذا كل شيء ... لذلك نستخدم عمومًا الطريقة الثالثة للحصول على ملف تكوين Spring ، وبالتالي الحصول على الفاصوليا المقابلة.
الرابط الأصلي: http://blog.csdn.net/eson_15/article/details/51373937
ما سبق هو الحل لتحطم iPhone 6Splus WeChat. آمل أن يكون ذلك مفيدًا للجميع. آمل أيضًا أن يدعم الجميع wulin.com ويولي المزيد من الاهتمام لمحتوى أكثر إثارة على wulin.com.