บทบาท / วัตถุประสงค์ของ ContextLoaderListener ใน Spring?


169

ฉันกำลังเรียนรู้Spring Frameworkที่ใช้ในโครงการของฉัน ฉันพบ รายการContextLoaderListenerในไฟล์web.xmlของฉัน แต่ไม่สามารถทราบได้ว่ามันช่วยนักพัฒนาได้อย่างไร

ในเอกสารอย่างเป็นทางการของContextLoaderListenerมันบอกว่ามันคือการเริ่มต้นWebApplicationContext เกี่ยวกับWebApplicationContext JavaDocs พูดว่า:

อินเตอร์เฟสเพื่อจัดเตรียมคอนฟิกูเรชันสำหรับเว็บแอ็พพลิเคชัน


แต่ฉันไม่สามารถเข้าใจสิ่งที่ฉันประสบความสำเร็จด้วยContextLoaderListenerซึ่งเริ่มต้นWebApplicationContextภายในได้หรือไม่

ตามความเข้าใจของฉัน , ContextLoaderListener อ่านแฟ้มการกำหนดค่าฤดูใบไม้ผลิ (มีค่าที่กำหนดกับ contextConfigLocation ในweb.xml ) แยกวิเคราะห์และโหลดถั่วเดี่ยวที่กำหนดไว้ในไฟล์ config ว่า ในทำนองเดียวกันเมื่อเราต้องการโหลดถั่วต้นแบบเราจะใช้บริบท webapplication เดียวกันในการโหลด ดังนั้นเราเริ่มต้น webapplication ด้วยContextLoaderListenerเพื่อให้เราอ่าน / แยก / ตรวจสอบไฟล์ config ล่วงหน้าและเมื่อใดก็ตามที่เราต้องการฉีดพึ่งพาเราสามารถทำได้ทันทีโดยไม่ล่าช้า ความเข้าใจนี้ถูกต้องหรือไม่


1
ทุกคนสามารถแจ้งให้เราทราบถึงความแตกต่างระหว่าง RequestContextListener และ ContextLoaderListener ได้ไหม
VdeX

คำตอบ:


111

ความเข้าใจของคุณถูกต้อง ApplicationContextคือที่ถั่วฤดูใบไม้ผลิของคุณมีชีวิตอยู่ วัตถุประสงค์ของการContextLoaderListenerเป็นสองเท่า:

  1. เพื่อเชื่อมโยงวงจรชีวิตของApplicationContextกับวงจรชีวิตของServletContextและ

  2. เพื่อสร้างการสร้างโดยอัตโนมัติApplicationContextดังนั้นคุณไม่จำเป็นต้องเขียนรหัสที่ชัดเจนเพื่อสร้างมัน - มันเป็นฟังก์ชั่นอำนวยความสะดวก

อีกสิ่งที่สะดวกเกี่ยวกับContextLoaderListenerมันคือการสร้างWebApplicationContextและWebApplicationContextให้การเข้าถึงServletContextผ่านServletContextAwareถั่วและgetServletContextวิธีการ


2
ฉันมีข้อสงสัยเกี่ยวกับประเด็นที่สองของคุณ คุณบอกว่า ServletContextListener ให้การเข้าถึง ServletContext แต่แม้ว่า web.xml จะไม่มี ServletContextListener แต่ ServletContext สามารถเข้าถึงได้ผ่าน WebApplicationContext (WebApplicationContext จะต้องมีการ autowired) ดังนั้นมันเกี่ยวข้องกับ ServletContext อย่างไร
Sumit Desai

WebApplicationContextมันสร้าง ไม่เช่นนั้นจะต้องสร้างขึ้นเอง
sourcedelica

ไม่ContextLoaderListenerใช้วิธีการทำลายที่จะทำลายถั่วทั้งหมดเมื่อปิดภาชนะเว็บลง?
asgs

ใช่ - มันจะทำเช่นนั้นเมื่อcontextDestroyedถูกเรียก ดูเอกสาร API
sourcedelica

@sourcedelica ฉันมีข้อสงสัยหลังจากอ่านสิ่งนี้แล้วฉันได้ตรวจสอบใบสมัครweb.xmlแล้ว ในไฟล์ xml ของฉันมีสองฟังและContextLoaderListener DispatcherServletดังนั้นฉันเดาว่าไม่จำเป็นต้องใช้ทั้งสองอย่างปลอดภัยไหมที่จะลบContextLoaderListenerสาเหตุที่ฉันถามเพราะแอปพลิเคชันมีชีวิตอยู่ตั้งแต่ 7-8 เดือน web.xml อยู่ที่นี่สำหรับการอ้างอิงของคุณ
Amogh

43

ContextLoaderListenerเป็นตัวเลือก เพียงเพื่อให้จุดที่นี่: คุณสามารถบูตขึ้นแอพลิเคชันฤดูใบไม้ผลิโดยที่ไม่เคยกำหนดค่าContextLoaderListenerเพียงแค่ขั้นต่ำขั้นพื้นฐานด้วยweb.xmlDispatcherServlet

นี่คือสิ่งที่ดูเหมือนว่า:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" 
    version="2.5">
  <display-name>Some Minimal Webapp</display-name>
  <welcome-file-list>   
    <welcome-file>index.jsp</welcome-file>    
  </welcome-file-list>

  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>

สร้างไฟล์ชื่อและเก็บไว้ภายใต้dispatcher-servlet.xml WEB-INFนับตั้งแต่ที่เราได้กล่าวในรายการต้อนรับเพิ่มไฟล์นี้อยู่ภายใต้index.jspWEB-INF

มอบหมายงาน-servlet.xml

ในdispatcher-servlet.xmlกำหนดถั่วของคุณ:

<?xml version="1.0" encoding="UTF-8"?>
<beans 
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd     
        http://www.springframework.org/schema/context     
        http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="bean1">
      ...
    </bean>
    <bean id="bean2">
      ...
    </bean>         

    <context:component-scan base-package="com.example" />
    <!-- Import your other configuration files too -->
    <import resource="other-configs.xml"/>
    <import resource="some-other-config.xml"/>

    <!-- View Resolver -->
    <bean 
        id="viewResolver" 
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
      <property 
          name="viewClass" 
          value="org.springframework.web.servlet.view.JstlView" />
      <property name="prefix" value="/WEB-INF/jsp/" />
      <property name="suffix" value=".jsp" />
    </bean>
</beans>

2
หากเป็นตัวเลือกคุณต้องการใช้เมื่อใด ดูเหมือนว่า Spring Security ต้องการให้ใช้ DelegatingFilterProxy
David

6
คุณต้องใช้มันเมื่อคุณต้องการวางไฟล์ servlet ของคุณในตำแหน่งที่กำหนดเองหรือด้วยชื่อที่กำหนดเองแทนที่จะใช้ชื่อเริ่มต้น "[servlet-name] -servlet.xml" และพา ธ ภายใต้ "Web-INF /"
Ramesh Karna

เป็นความคิดที่ดีหรือไม่ที่จะกำหนด bean ใน dispatcher-servlet.xml มากกว่า applicationContext.xml
Chetan Gole

8
โดยปกติแล้วจะเป็นการดีกว่าที่จะแจกจ่ายถั่วโดยสะท้อนเลเยอร์ของสถาปัตยกรรมของแอปพลิเคชันของคุณ ถั่วสำหรับเลเยอร์การนำเสนอ (ตัวอย่างเช่นตัวควบคุม mvc) สามารถอยู่ใน dispatcher-servlet.xml ถั่วที่เป็นของชั้นบริการควรกำหนด applicationContext.xml ไม่ใช่กฎที่เข้มงวด แต่เป็นวิธีปฏิบัติที่ดีในการแยกความกังวลออก
Claudio Venturini

2
@Ramesh Karna ฉันไม่คิดว่ามันจำเป็นสำหรับการเปลี่ยนชื่อและที่ตั้ง ฉันคิดว่ามันจำเป็นเมื่อเรากำลังเริ่มต้นหลาย servlets Dispatcher และยังต้องการบริบทรากที่จะแบ่งปันโดยบริบทของ DispaterServlets ทั้งหมดเองแล้วเราต้องใช้ ContextLoaderListener
ซูเปอร์โนวา

23

สำหรับการประยุกต์ใช้ในฤดูใบไม้ผลิง่ายคุณไม่ได้มีการกำหนดContextLoaderListenerในของคุณweb.xml; คุณสามารถใส่ไฟล์กำหนดค่าสปริงทั้งหมดของคุณใน<servlet>:

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/mvc-core-config.xml, classpath:spring/business-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

สำหรับแอ็พพลิเคชัน Spring ที่ซับซ้อนมากขึ้นซึ่งคุณมีหลาย ๆ การDispatcherServletกำหนดคุณสามารถมีไฟล์คอนฟิกูเรชัน Spring ทั่วไปที่แบ่งใช้โดยทั้งหมดที่DispatcherServletกำหนดไว้ในContextLoaderListener:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/common-config.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>mvc1</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/mvc1-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
    <servlet-name>mvc2</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/mvc2-config.xmll</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

เพียงจำไว้ให้ContextLoaderListenerดำเนินการเริ่มต้นจริงสำหรับบริบทแอปพลิเคชันรู

ฉันพบบทความนี้ช่วยได้มาก: Spring MVC - บริบทของแอปพลิเคชันเทียบกับบริบทของเว็บแอปพลิเคชัน


บทความที่ใช้ร่วมกันที่นี่รับประกันความเข้าใจอย่างลึกซึ้งในแนวคิด
Priyank Thakkar

10

บล็อก " วัตถุประสงค์ของ ContextLoaderListener - Spring MVC " ให้คำอธิบายที่ดีมาก

ตามที่มัน Application-Contexts เป็นลำดับชั้นและดังนั้นบริบทของ DispatcherSerlvet จึงกลายเป็นลูกของบริบทของ ContextLoaderListener เนื่องจากเทคโนโลยีที่ใช้ในเลเยอร์ควบคุม (Struts หรือ Spring MVC) สามารถแยกจากบริบทรูทที่สร้างขึ้น ContextLoaderListener


ขอขอบคุณที่แบ่งปันเพื่อนของคุณ .. :)
Deepak Kumar

3

เมื่อคุณต้องการที่จะนำไฟล์ Servlet ของคุณในสถานที่ที่กำหนดเองหรือกับชื่อที่กำหนดเองมากกว่าการตั้งชื่อเริ่มต้น[servletname]-servlet.xmlและเส้นทางภายใต้แล้วคุณสามารถใช้Web-INF/ContextLoaderListener


3

ContextLoaderListner เป็นผู้ฟัง Servlet ที่โหลดไฟล์การกำหนดค่าที่แตกต่างกันทั้งหมด (การกำหนดค่าเลเยอร์บริการ, การกำหนดค่าเลเยอร์การเก็บข้อมูลเป็นต้น) ลงในบริบทแอปพลิเคชันสปริงเดียว

สิ่งนี้จะช่วยแบ่งการกำหนดค่าสปริงในไฟล์ XML หลายไฟล์

เมื่อโหลดไฟล์บริบทแล้ว Spring จะสร้างวัตถุ WebApplicationContext ตามนิยามของ bean และเก็บไว้ใน ServletContext ของเว็บแอปพลิเคชันของคุณ


3

ป้อนคำอธิบายรูปภาพที่นี่ผู้ฟัง Bootstrap นี้จะเริ่มต้นและปิดรากของ Spring WebApplicationContextเนื่องจากเว็บแอปพลิเคชันสามารถมีหลายผู้รับส่งข้อมูล servlet และแต่ละคนมีบริบทแอปพลิเคชันของตัวเองที่มีตัวควบคุมดูตัวแก้ไขการแมปจัดการ ฯลฯ แต่คุณอาจต้องการมีบริการถั่วถั่ว DAO ในบริบทของแอปพลิเคชันลูก บริบทของแอปพลิเคชันที่สร้างโดย dispatcher servlets)

การใช้ฟังครั้งที่สองนี้คือเมื่อคุณต้องการใช้การรักษาความปลอดภัยสปริง


3

บริบทของรูทและเด็กก่อนที่จะอ่านเพิ่มเติมโปรดเข้าใจว่า -

ฤดูใบไม้ผลิสามารถมีหลายบริบทได้ตลอดเวลา หนึ่งในนั้นจะเป็นบริบทของรากและบริบทอื่น ๆ ทั้งหมดจะเป็นบริบทของเด็ก

บริบทย่อยทั้งหมดสามารถเข้าถึง 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


2

โดยทั่วไปคุณสามารถแยกบริบทแอปพลิเคชันรูทและบริบทเว็บแอปพลิเคชันโดยใช้ ContextLoaderListner

ไฟล์กำหนดค่าที่แมปกับบริบทพารามิเตอร์จะทำหน้าที่เป็นการกำหนดค่าบริบทของแอปพลิเคชันรูท และไฟล์กำหนดค่าที่แมปกับโปรแกรมเลือกจ่ายงานจะทำหน้าที่เหมือนบริบทของเว็บแอปพลิเคชัน

ในเว็บแอปพลิเคชันใด ๆ เราอาจมีหลายผู้รับส่งข้อมูลเซิร์ฟเล็ตดังนั้นบริบทเว็บแอปพลิเคชันหลายรายการ

แต่ในเว็บแอปพลิเคชันใด ๆ เราอาจมีบริบทแอปพลิเคชันรูทเพียงบริบทเดียวที่ใช้ร่วมกับบริบทของเว็บแอปพลิเคชันทั้งหมด

เราควรกำหนดบริการทั่วไปหน่วยงานด้านอื่น ๆ ในบริบทของแอปพลิเคชันรูท และตัวควบคุมตัวดัก ฯลฯ อยู่ในบริบทของเว็บแอปพลิเคชันที่เกี่ยวข้อง

ตัวอย่าง web.xml คือ

<!-- language: xml -->
<web-app>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>example.config.AppConfig</param-value>
    </context-param>
    <servlet>
        <servlet-name>restEntryPoint</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>example.config.RestConfig</param-value>
        </init-param>       
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>restEntryPoint</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>webEntryPoint</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>example.config.WebConfig</param-value>
        </init-param>       
        <load-on-startup>1</load-on-startup>
    </servlet>  
    <servlet-mapping>
        <servlet-name>webEntryPoint</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app> 

ที่นี่ config class example.config.AppConfig สามารถใช้เพื่อกำหนดค่าบริการเอนทิตี้ด้านอื่น ๆ ในบริบทของแอปพลิเคชันรูทที่จะใช้ร่วมกับบริบทแอปพลิเคชันเว็บอื่น ๆ ทั้งหมด (ตัวอย่างเช่นที่นี่เรามีสองบริบทแอปพลิเคชันเว็บ

PS: ที่นี่ ContextLoaderListener เป็นตัวเลือกที่สมบูรณ์ หากเราจะไม่พูดถึง ContextLoaderListener ใน web.xml ที่นี่ AppConfig จะไม่ทำงาน ในกรณีนี้เราต้องกำหนดค่าบริการและเอนทิตีทั้งหมดของเราใน WebConfig และ Rest Config


1

มันจะช่วยให้คุณเข้าใจจุดที่ต้องวางโค้ดบางอย่างที่คุณต้องการให้เรียกใช้งานบนเว็บแอปพลิเคชันเวลา


Jigar จริง ๆ แล้วนี่คือสิ่งที่ฉันพยายามค้นหาอะไรคือคุณสมบัติคลาสตัวโหลดบริบทดีฟอลต์ที่จัดเตรียมไว้ในเวลาการปรับใช้?
M Sach

การเปลี่ยนคุณสมบัติ / ไฟล์ xml และให้พวกเขาโหลดใหม่ในเวลาทำงานโดยไม่ต้องรีสตาร์ทเซิร์ฟเวอร์
vsingh

1

คลาสผู้ฟัง - ฟังเหตุการณ์ (เช่นการเริ่มต้น / ปิดเซิร์ฟเวอร์)

ContextLoaderListener -

  1. ฟังระหว่างเซิร์ฟเวอร์เริ่มทำงาน / ปิดเครื่อง
  2. ใช้ไฟล์คอนฟิกูเรชัน Spring เป็นอินพุตและสร้าง beans ตามการกำหนดค่าและทำให้พร้อม (ทำลายถั่วในระหว่างปิดระบบ)
  3. ไฟล์การกำหนดค่าสามารถให้ได้เช่นนี้ใน web.xml

    <param-name>contextConfigLocation</param-name>  
    <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>  

1

ในบริบทของวัตถุประสงค์สปริงเฟรมเวิร์กของContextLoaderListenerคือการโหลด bean อื่น ๆ ในแอปพลิเคชันของคุณเช่นคอมโพเนนต์ระดับกลางและชั้นข้อมูลที่ขับเคลื่อนด้านหลังของแอปพลิเคชัน


0

ความเข้าใจของคุณถูกต้อง ฉันสงสัยว่าทำไมคุณไม่เห็นข้อได้เปรียบใน ContextLoaderListener ตัวอย่างเช่นคุณต้องสร้างโรงงานเซสชัน (เพื่อจัดการฐานข้อมูล) การดำเนินการนี้อาจใช้เวลาสักครู่จึงเป็นการดีกว่าที่จะทำเมื่อเริ่มต้น แน่นอนว่าคุณสามารถทำได้ด้วย init servlets หรืออย่างอื่น แต่ข้อดีของวิธีการของ Spring คือคุณทำการกำหนดค่าโดยไม่ต้องเขียนโค้ด


0

ถ้าเราเขียน web.xml โดยไม่มี ContextLoaderListener เราก็ไม่สามารถมอบความกระตือรือร้นโดยใช้ customAuthenticationProvider ในการรักษาความปลอดภัยสปริง เนื่องจาก DispatcherServelet เป็นบริบทลูกของ ContextLoaderListener, customAuthenticationProvider เป็นส่วนหนึ่งของ parentContext ที่เป็น ContextLoaderListener ดังนั้นบริบทหลักไม่สามารถมีบริบทของลูกได้ ดังนั้นจึงเป็นวิธีปฏิบัติที่ดีที่สุดในการเขียน spring-context.xml ใน contextparam แทนที่จะเขียนใน initparam


0

ฉันเชื่อว่าการใช้งานจริงมาเมื่อคุณต้องการมีไฟล์ config มากกว่าหนึ่งไฟล์หรือคุณมีไฟล์xyz.xmlแทนที่จะเป็น applicationcontext.xml เช่น

<context-param><param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/training-service.xml, /WEB-INF/training-data.xml</param-value> </context-param>

อีกวิธีหนึ่งในการใช้ ContextLoaderListener คือการใช้ ContextLoaderServlet ดังนี้

<servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.