เมื่อเรากำลังทำงานในโครงการเราจะใช้ผู้ฟังเพื่อรับไฟล์การกำหนดค่าสปริงจากนั้นนำถั่วที่เราต้องการจากมัน ตัวอย่างเช่นเพื่อทำให้เว็บไซต์หน้าแรก สมมติว่าตรรกะทางธุรกิจพื้นหลังของผลิตภัณฑ์ทำได้ดีเราจำเป็นต้องสร้างผู้ฟังและสอบถามข้อมูลหน้าแรกในการเริ่มต้นโครงการและนำไปใช้ในแอปพลิเคชันนั่นคือวิธีการเรียกตรรกะทางธุรกิจของผลิตภัณฑ์พื้นหลังในผู้ฟังนั่นคือเราต้องได้รับถั่วที่สอดคล้องกันในฤดูใบไม้ผลิ สร้างผู้ฟังก่อน:
1. สร้าง InitDatalistener
สร้างผู้เริ่ม initDatalistener สืบทอด ServletContextListener:
/** * @description: todo (ใช้ในการเริ่มต้นข้อมูลเมื่อเริ่มโครงการ) * @author eson_15 * */// @Component // Listener เป็นส่วนประกอบของ Web Layer มันเป็นอินสแตนซ์ของ Tomcat ไม่ใช่อินสแตนซ์ในฤดูใบไม้ผลิ ไม่สามารถใส่ในสปริงคลาสสาธารณะ initDatalistener ใช้ servletContextListener {ผลิตภัณฑ์ส่วนตัวผลิตภัณฑ์บริการ = null; // productservice กำหนดตรรกะทางธุรกิจที่เกี่ยวข้องกับผลิตภัณฑ์ @Override โมฆะสาธารณะบริบทและกำหนดค่าผู้ฟังใน web.xml:
ดังที่ได้กล่าวไว้ข้างต้นตรรกะทางธุรกิจบางอย่างของผลิตภัณฑ์ถูกกำหนดไว้ในผลิตภัณฑ์ผลิตภัณฑ์และบริการผลิตภัณฑ์นี้ถูกส่งมอบให้กับฤดูใบไม้ผลิเพื่อการจัดการ แล้วเราจะได้รับวัตถุนี้ได้อย่างไร? สิ่งแรกที่ต้องแน่ใจคือ: เราไม่สามารถนำมันออกมาได้ด้วยตัวเองเพราะถ้ามันออกมามันไม่มีอะไรเกี่ยวข้องกับ IOC ของฤดูใบไม้ผลิ ... มีสามวิธีหลักในการบรรลุเป้าหมาย เราวิเคราะห์ทีละคนและในที่สุดก็เปรียบเทียบข้อดีและข้อเสีย
2. โหลดไฟล์ beans.xml โดยตรง
วิธีนี้ง่ายและหยาบ คุณไม่จำเป็นต้องโหลดไฟล์การกำหนดค่าหรือไม่ โอเคฉันจะโหลดดังนี้:
//@Component // Listener เป็นส่วนประกอบของ Web Layer มันเป็นอินสแตนซ์โดย Tomcat ไม่ใช่ฤดูใบไม้ผลิ ไม่สามารถนำไปใช้ในสปริงคลาสสาธารณะ initDatalistener ใช้ servletContextListener {ผลิตภัณฑ์ส่วนตัว Productservice Productservice = NULL; // Productservice กำหนดตรรกะทางธุรกิจที่เกี่ยวข้องกับผลิตภัณฑ์ @Override public void contextroyed (Event ServletContextEvent) {} @Override โมฆะสาธารณะบริบท (เหตุการณ์ ServletContextEvent) {// ได้รับลอจิกทางธุรกิจ Productservice = (Productservice) Context.getBean ("Productservice"); System.out.println (Productservice); // เอาต์พุตเพื่อดูว่าคุณได้รับ // ต่อไปนี้คือการดำเนินการเฉพาะผลิตภัณฑ์ที่เกี่ยวข้องกับผลิตภัณฑ์ ... }}วิธีนี้ดีอย่างสมบูรณ์และความคิดนั้นชัดเจนมาก ก่อนที่จะโหลดไฟล์การกำหนดค่า beans.xml จากนั้นรับถั่ว อย่างไรก็ตามหลังจากเริ่มต้น Tomcat ลองดูที่เอาต์พุตข้อมูลจากคอนโซล:
ณ จุดนี้เราควรค้นหาข้อเสียของวิธีนี้ ไฟล์การกำหนดค่าถูกโหลดสองครั้งซึ่งหมายความว่าถั่วเหล่านั้นถูกอินสแตนซ์สองครั้ง เมื่อพิจารณาจากข้อมูลที่พิมพ์ออกมาเราได้ถั่วที่เราโหลดไฟล์การกำหนดค่าตัวเองและอินสแตนซ์ วิธีนี้ไม่เป็นที่พึงปรารถนาอย่างเห็นได้ชัด
3. รับจาก servletContext
จากวิธีการข้างต้นอย่างน้อยเราก็รู้ได้ว่าฤดูใบไม้ผลิได้โหลดไฟล์การกำหนดค่าหนึ่งครั้งผ่านผู้ฟัง เราไม่จำเป็นต้องโหลดอีกครั้ง เป็นเรื่องง่ายที่จะคิดว่าถ้าเรารู้ว่ามีการโหลดสปริงที่ไหนเราจะได้รับไฟล์การกำหนดค่าจากที่นั่น ลองมาดูกระบวนการโหลดไฟล์การกำหนดค่าในฤดูใบไม้ผลิ:
ในรูปด้านบน (ถูกละเว้นรหัสที่ไม่เกี่ยวข้อง), contextloaderListener เป็นตัวฟังฤดูใบไม้ผลิที่เรากำหนดค่าใน web.xml นอกจากนี้ยังใช้ servletContextListener และสืบทอดบริบท ในผู้ฟังไฟล์การกำหนดค่าส่วนใหญ่จะได้รับผ่านวิธีการเริ่มต้นการเชื่อมต่อและสร้างวัตถุ WebApplicationContext ในเมธอด InitWebapplicationContext มีสองสิ่งหลักที่ทำ: หนึ่งคือการได้รับบริบทสปริงและอีกอย่างคือการใส่บริบทสปริงลงใน ServletContext และคีย์คือ: WebApplicationContext.root_web_application_context_attribute แล้วคุณจะได้รับบริบทของฤดูใบไม้ผลิได้อย่างไร? มันคือการได้รับเส้นทางของสปริงที่กำหนดค่าใน web.xml config_location_parm เป็นค่าคงที่สตริงซึ่งเป็นตัวฟังสปริงที่กำหนดค่าต่อไปนี้ใน web.xml:
<context-Param> <param-Name> contextConfigLocation </param-name> <!-config_location_parm คือ contextconfiglocation-> <param-value> classpath: beans.xml </param-value> </context-param>
ดังนั้นจึงเห็นได้ชัดว่าคุณจะได้รับ beans.xml ผ่านเส้นทางที่กำหนดค่าใน web.xml จากนั้นโหลดไฟล์การกำหนดค่านี้และสร้างอินสแตนซ์ถั่ว
ตอนนี้เรารู้แล้วว่าหลังจากฤดูใบไม้ผลิโหลดไฟล์การกำหนดค่าและวางไว้ใน ServletContext เราสามารถไปที่นี่และรับได้โดยตรง!
//@Component // Listener เป็นส่วนประกอบของ Web Layer มันเป็นอินสแตนซ์โดย Tomcat ไม่ใช่ฤดูใบไม้ผลิ ไม่สามารถนำไปใช้ในสปริงคลาสสาธารณะ initDatalistener ใช้ servletContextListener {ผลิตภัณฑ์ส่วนตัว Productservice Productservice = NULL; @Override เป็นโมฆะสาธารณะบริบท (เหตุการณ์ servletContextEvent) {// วิธีการที่สร้างขึ้นอัตโนมัติ} @Override โมฆะสาธารณะบริบทบริบท (Event ServletContextEvent) {// รับข้อมูลการสืบค้นชั้นเรียนลอจิกทางธุรกิจ // โซลูชัน 2: เมื่อโครงการเริ่มต้น เราเพียงแค่ต้องได้รับมันใน servletContext ApplicationContext Context = (ApplicationContext) Event.getServletContext () .getAttribute (webApplicationContext.root_web_application_context_attribute); Productservice = (Productservice) Context.getBean ("Productservice"); System.out.println (Productservice); - ด้วยวิธีนี้เราสามารถรับวัตถุอินสแตนซ์ของผู้ผลิต วิธีนี้ดี แต่พารามิเตอร์ใน GetAttribute นั้นยาวเกินไป ฉันไม่รู้ว่าหน้าผากของโปรแกรมเมอร์ถูกตัดในเวลานั้นหรือไม่ ฉันเดาว่าเขาไม่สามารถนึกถึงชื่ออื่นที่เหมาะสมกว่านี้ได้ ~
4. การโหลดผ่านคลาสเครื่องมือที่จัดทำโดย Spring <br /> อาจจะเป็นคนตัวใหญ่ที่พัฒนาสปริงก็ตระหนักว่าชื่อของพารามิเตอร์นี้ยาวเกินไปดังนั้นพวกเขาจึงให้คลาสวิธีการที่สามารถโหลดไฟล์การกำหนดค่า:
คลาสสาธารณะ initDatalistener ใช้ servletContextListener {ผลิตภัณฑ์ส่วนตัว Productservice Productservice = NULL; @Override เป็นโมฆะสาธารณะบริบท (เหตุการณ์ servletContextEvent) {// วิธีการที่สร้างขึ้นอัตโนมัติ} @Override โมฆะสาธารณะบริบทบริบท (servletContextEvent เหตุการณ์) {// รับข้อมูลการค้นหาคลาส Productservice = (Productservice) Context.getBean ("Productservice"); System.out.println (Productservice); - ในความเป็นจริงวิธี getWebapplicationContext ที่นี่เพียงแค่ห่อหุ้มวิธีข้างต้น ลองดูที่ซอร์สโค้ดของวิธีนี้:
สาธารณะ webApplicationContext GetWebapplicationContext (ServletContext SC) {return getWebapplicationContext (SC, WebApplicationContext.root_web_aplication_context_attribute); -สิ่งนี้สะดวกกว่าสำหรับโปรแกรมเมอร์ที่จะโทรนั่นคือทั้งหมด ... ดังนั้นโดยทั่วไปเราใช้วิธีที่สามเพื่อรับไฟล์การกำหนดค่าของสปริงซึ่งจะได้รับถั่วอินสแตนซ์ที่เกี่ยวข้อง
ลิงค์ดั้งเดิม: http://blog.csdn.net/eson_15/article/details/51373937
ด้านบนเป็นวิธีแก้ปัญหาของ iPhone 6SPLUS WECHAT Crash ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน ฉันหวังว่าทุกคนจะสนับสนุน Wulin.com และให้ความสำคัญกับเนื้อหาที่น่าตื่นเต้นมากขึ้นใน Wulin.com