บริบทของรูทและเด็กก่อนที่จะอ่านเพิ่มเติมโปรดเข้าใจว่า -
ฤดูใบไม้ผลิสามารถมีหลายบริบทได้ตลอดเวลา หนึ่งในนั้นจะเป็นบริบทของรากและบริบทอื่น ๆ ทั้งหมดจะเป็นบริบทของเด็ก
บริบทย่อยทั้งหมดสามารถเข้าถึง beans ที่กำหนดในบริบทรูท แต่ตรงกันข้ามไม่เป็นความจริง บริบทรูทไม่สามารถเข้าถึงเด็กบริบทถั่ว
ApplicationContext:
applicationContext.xml คือการกำหนดค่าบริบทรูทสำหรับทุกเว็บแอปพลิเคชัน Spring โหลดไฟล์ applicationContext.xml และสร้าง ApplicationContext สำหรับแอปพลิเคชันทั้งหมด จะมีเพียงบริบทแอปพลิเคชันเดียวต่อเว็บแอปพลิเคชัน หากคุณไม่ได้ประกาศชื่อไฟล์การกำหนดค่าบริบทใน web.xml อย่างชัดเจนโดยใช้ contextConfigLocation param สปริงจะค้นหา applicationContext.xml ภายใต้โฟลเดอร์ WEB-INF และโยน FileNotFoundException หากไม่พบไฟล์นี้
ContextLoaderListener ดำเนินการเริ่มต้นทำงานจริงสำหรับบริบทของแอ็พพลิเคชันรูท อ่าน“ contextConfigLocation” context-param และส่งผ่านค่าของมันไปยังอินสแตนซ์บริบทแยกวิเคราะห์มันเป็นพา ธ ไฟล์หลายเส้นทางซึ่งสามารถคั่นด้วยเครื่องหมายจุลภาคและช่องว่างจำนวนเท่าใดก็ได้เช่น“ WEB-INF / applicationContext1.xml, WEB-INF / applicationContext2.xml” ContextLoaderListener เป็นทางเลือก เพียงทำจุดตรงนี้: คุณสามารถบูทแอปพลิเคชั่น Spring ได้โดยไม่ต้องกำหนดค่า ContextLoaderListener เพียงแค่ web.xml ขั้นต่ำขั้นพื้นฐานด้วย DispatcherServlet
DispatcherServlet DispatcherServlet เป็นหลัก Servlet (ขยาย HttpServlet) ซึ่งมีวัตถุประสงค์หลักคือการจัดการการร้องขอเว็บขาเข้าที่ตรงกับรูปแบบ URL ที่กำหนดค่า มันใช้ URI ที่เข้ามาและค้นหาการผสมผสานที่เหมาะสมของตัวควบคุมและมุมมอง ดังนั้นมันจึงเป็นตัวควบคุมด้านหน้า
เมื่อคุณกำหนด DispatcherServlet ในการกำหนดค่าแบบสปริงคุณจะต้องระบุไฟล์ XML พร้อมกับรายการของคลาสตัวควบคุมมุมมองการแมปอื่น ๆ โดยใช้แอ็ตทริบิวต์ contextConfigLocation
WebApplicationContext นอกเหนือจาก ApplicationContext อาจมีหลาย WebApplicationContext ในแอปพลิเคชันเว็บเดียว ในคำง่าย ๆ DispatcherServlet แต่ละอันเชื่อมโยงกับ WebApplicationContext เดียว ไฟล์ xxx-servlet.xml มีลักษณะเฉพาะกับ DispatcherServlet และเว็บแอปพลิเคชันสามารถมี DispatcherServlet ได้มากกว่าหนึ่งรายการที่กำหนดค่าเพื่อจัดการคำขอ ในสถานการณ์ดังกล่าวแต่ละ DispatcherServlet จะมีการกำหนดค่า xxx-servlet.xml แยกต่างหาก แต่ applicationContext.xml จะเป็นเรื่องปกติสำหรับไฟล์การกำหนดค่า servlet ทั้งหมด Spring จะตามค่าเริ่มต้นโหลดไฟล์ชื่อ“ xxx-servlet.xml” จากโฟลเดอร์ webapps WEB-INF ของคุณโดยที่ xxx คือชื่อ servlet ใน web.xml หากคุณต้องการเปลี่ยนชื่อของชื่อไฟล์นั้นหรือเปลี่ยนตำแหน่งให้เพิ่ม init-param ด้วย contextConfigLocation เป็นชื่อ param
เปรียบเทียบและความสัมพันธ์ระหว่างพวกเขา:
ContextLoaderListener vs DispatcherServlet
ContextLoaderListener สร้างบริบทของรูทแอปพลิเคชัน รายการ DispatcherServlet สร้างบริบทแอปพลิเคชันย่อยหนึ่งรายการต่อรายการเซิร์ฟเล็ต บริบทย่อยสามารถเข้าถึง beans ที่กำหนดในบริบทรูท ถั่วในบริบทรากไม่สามารถเข้าถึงถั่วในบริบทเด็ก (โดยตรง) บริบททั้งหมดจะถูกเพิ่มไปยัง ServletContext คุณสามารถเข้าถึงบริบทรูทโดยใช้คลาส WebApplicationContextUtils
หลังจากอ่านเอกสาร Spring แล้วความเข้าใจต่อไปนี้คือ:
a) บริบทของแอปพลิเคชันเป็นลำดับชั้นและดังนั้น WebApplicationContexts ดูเอกสารที่นี่
b) ContextLoaderListener สร้างรูทเว็บแอปพลิเคชันบริบทสำหรับเว็บแอปพลิเคชันและวางไว้ใน ServletContext บริบทนี้สามารถใช้เพื่อโหลดและยกเลิกการโหลดถั่วที่จัดการโดยสปริงตามลำดับเทคโนโลยีที่ใช้ในเลเยอร์ควบคุม (Struts หรือ Spring MVC)
c) DispatcherServlet สร้าง WebApplicationContext ของตัวเองและตัวจัดการ / คอนโทรลเลอร์ / มุมมอง - ตัวแก้ไขจะถูกจัดการโดยบริบทนี้
d) เมื่อ ContextLoaderListener ถูกใช้ควบคู่กับ DispatcherServlet รูทเว็บแอ็พพลิเคชันบริบทจะถูกสร้างขึ้นก่อนตามที่ได้กล่าวไว้ก่อนหน้านี้และยังสร้าง Child-context โดย DispatcherSerlvet และแนบกับรูทแอ็พพลิเคชันบริบท ดูเอกสารที่นี่
เมื่อเราทำงานกับ Spring MVC และใช้ Spring ในเลเยอร์บริการเรามีสองบริบทของแอปพลิเคชัน คนแรกมีการกำหนดค่าโดยใช้ ContextLoaderListener และคนอื่น ๆ ด้วย DispatcherServlet
โดยทั่วไปคุณจะกำหนด Muts ที่เกี่ยวข้องทั้งหมด (ตัวควบคุมและมุมมอง ฯลฯ ) ในบริบท DispatcherServlet และ cross-cutting beans ทั้งหมดเช่นความปลอดภัยธุรกรรมธุรกรรมบริการ ฯลฯ ที่บริบทรูทโดย ContextLoaderListener
อ้างถึงนี้สำหรับรายละเอียดเพิ่มเติม:
https://siddharthnawani.blogspot.com/2019/10/contextloaderlistener-vs.html