ดังที่คุณทราบกันดีแล้ว Spring Boot เป็นวิธีที่ยอดเยี่ยมในการพัฒนา WebApp หรือ StandaloneApp ด้วยการกำหนดค่าขั้นต่ำและการตั้งค่าที่ให้ความเห็น
นี่คือวิธีที่ฉันประสบความสำเร็จในการพัฒนา Web Filter ในแอปพลิเคชัน Spring Boot
My SpringBootApp ข้อมูลจำเพาะ: -
เวอร์ชั่น Spring Boot: 2.0.4.RELEASE
เวอร์ชั่น Java: 8.0
Servlet Specification: Servlet 3.0 (จำเป็นและสำคัญ)
ฉันประกาศตัวกรองเว็บของฉันในลักษณะต่อไปนี้โดยปฏิบัติตามข้อกำหนดคุณสมบัติของ Servlet 3.0
นี่คือวิธีการโปรแกรมในการกำหนดตัวกรองแทนคำจำกัดความที่ใช้ web.xml
คำอธิบายประกอบ "@Webfilter" จะถูกประมวลผลโดยคอนเทนเนอร์ระหว่างการปรับใช้คลาสตัวกรองที่พบจะถูกสร้างขึ้นตามการกำหนดค่าและนำไปใช้กับรูปแบบ URL, javax.servlet.Servlets และ javax.servlet.DispatcherTypes
เพื่อหลีกเลี่ยง Web.xml อย่างสมบูรณ์และเพื่อให้บรรลุ WebApp "Deployable": -
ในการปรับใช้ Spring Boot Application เป็น "Traditional WAR" คลาสแอ็พพลิเคชันควรขยาย SpringBootServletInitializer
หมายเหตุ ::
SpringBootServletInitializer เป็น "การใช้งานแบบโปรแกรม" ของ web.xml โดยอ้างอิงกับข้อกำหนดของ Servlet 3.0+ ซึ่งต้องการการใช้งานของ WebApplicationInitializer
ดังนั้น SpringBootApplication ไม่จำเป็นต้องใช้ "web.xml" เป็นคลาสแอปพลิเคชัน (หลังจากขยาย SpringBootServletInitializer) เพื่อสแกนหา
- @WebFilter,
- @WebListener และ
- @WebServlet
คำอธิบายประกอบ @ServletComponentScan
คำอธิบายประกอบนี้เปิดใช้งานการสแกนแพ็กเกจฐานสำหรับคอมโพเนนต์ของเว็บที่ใส่คำอธิบายประกอบด้วย @WebFilter, @WebListener และ @WebServlet
เนื่องจากความจริงที่ว่าคอนเทนเนอร์แบบฝังไม่สนับสนุน @WebServlet, @WebFilter และ @WebListener คำอธิบายประกอบ, Spring Boot ใช้การพึ่งพาอย่างมากกับคอนเทนเนอร์แบบฝังจึงแนะนำคำอธิบายประกอบใหม่นี้ @ServletComponentScan
การสแกนจะดำเนินการเมื่อใช้คอนเทนเนอร์ Servlet แบบฝังเท่านั้น
ต่อไปนี้เป็นคำนิยามคลาส Spring Application ของฉัน: -
เครื่องมือกำหนดค่าเริ่มต้น Servlet แบบกำหนดเอง: -
ที่นี่: ฉันได้กำหนดคลาสที่กำหนดเอง: "ServletInitializer" ซึ่งขยายคลาส: SpringBootServletInitializer
ตามที่อธิบายไว้ก่อนหน้านี้ SpringBootServletInitializer รับผิดชอบการสแกนหมายเหตุประกอบ: -
- @WebFilter
- @WebListener และ
- @WebServlet
ดังนั้น Spring Application Application Class จึงควร
- ขยายคลาส: SpringBootServletInitializer หรือ
- ขยายคลาสที่กำหนดเองซึ่งขยายคลาส: SpringBootServletInitializer