ใช้ Jersey กับ Spring Boot
เอกสารอ้างอิง Spring Boot ในหัวข้อ7.3 JAX-RS และ Jerseyกล่าวถึง " จุดสิ้นสุดที่ลงทะเบียนทั้งหมดควรเป็น @Components ที่มีคำอธิบายประกอบทรัพยากร HTTP (@GET และอื่น ๆ ) เนื่องจาก Endpoint เป็น Spring @Component วงจรชีวิตจึงได้รับการจัดการโดย Spring และคุณสามารถใช้คำอธิบายประกอบ @Autowired เพื่อแทรกการอ้างอิงและใช้คำอธิบายประกอบ @Value เพื่อแทรกการกำหนดค่าภายนอก "
แต่ฉันไม่สนใจที่จะฉีดการพึ่งพาหรือการกำหนดค่าภายนอกในทรัพยากร Jersey ของฉันและด้วยเหตุนี้ฉันจึงไม่ได้ใส่คำอธิบายประกอบทรัพยากร Jersey ของฉันเป็น @Components แอปของฉันทำงานได้ดี
จากการอ่านเอกสารอ้างอิง Spring Boot ดูเหมือนว่าการลงทะเบียนทรัพยากร Jersey เป็น @Components เป็นข้อกำหนด แต่ดูเหมือนจะไม่เป็นเช่นนั้น สำหรับฉันแล้วสิ่งนี้ดูเหมือนจะเป็นข้อบกพร่องเล็ก ๆ ในเอกสารอ้างอิง Spring Boot อาจเป็นเอกสารที่สามารถอัปเดตได้จาก " จุดสิ้นสุดที่ลงทะเบียนควรเป็น @Components " เป็น " ปลายทางที่ลงทะเบียนแล้วสามารถเป็น @Components " สิ่งนี้สมเหตุสมผลไหม
คำตอบ
ฉันได้ลองทำสิ่งนี้และพบว่าการใส่คำอธิบายประกอบทรัพยากร Jersey ด้วยคำอธิบายประกอบ Spring @Component เป็นทางเลือก หากคุณใช้คำอธิบายประกอบนั้นวัฏจักรชีวิตของทรัพยากรจะได้รับการจัดการโดย Spring และหากคุณไม่ใช้คำอธิบายประกอบนั้นวงจรชีวิตจะถูกจัดการโดย Jersey
สิ่งสำคัญอย่างหนึ่งที่ควรทราบคือมีความแตกต่างที่สำคัญในการตั้งโปรแกรมวงจรชีวิตโดยค่าเริ่มต้นระหว่างทั้งสอง
ตามที่ระบุไว้ในส่วน 3.4ของคู่มือผู้ใช้ Jersey " โดยค่าเริ่มต้นวงจรชีวิตของคลาสทรัพยากรรูทจะเป็นไปตามคำขอซึ่งกล่าวคืออินสแตนซ์ใหม่ของคลาสทรัพยากรรูทถูกสร้างขึ้นทุกครั้งที่เส้นทาง URI ของคำขอตรงกับทรัพยากรราก สิ่งนี้ทำให้เป็นแบบจำลองการเขียนโปรแกรมที่เป็นธรรมชาติมากซึ่งสามารถใช้ตัวสร้างและฟิลด์ได้โดยไม่ต้องกังวลกับการร้องขอพร้อมกันหลายรายการไปยังทรัพยากรเดียวกันโดยทั่วไปสิ่งนี้ไม่น่าจะเป็นสาเหตุของปัญหาด้านประสิทธิภาพการสร้างคลาสและการรวบรวมขยะของ JVM ได้รับการปรับปรุงอย่างมาก ปีและวัตถุจำนวนมากจะถูกสร้างและทิ้งเพื่อให้บริการและดำเนินการตามคำขอ HTTP และส่งคืนการตอบสนองของ HTTP "
แต่ตามที่ระบุไว้ในSpring Framework Documentation ส่วน 1.5 ; ถั่วโดยค่าเริ่มต้นคือซิงเกิลตัน " Spring IoC container สร้างอินสแตนซ์ของอ็อบเจ็กต์ที่กำหนดโดยนิยาม bean นั้นอินสแตนซ์เดียวนี้ถูกเก็บไว้ในแคชของ singleleton beans ดังกล่าวและคำร้องขอและการอ้างอิงที่ตามมาทั้งหมดสำหรับชื่อ bean นั้นจะส่งคืนอ็อบเจ็กต์ที่แคชไว้ "
ดังนั้นจึงมีความแตกต่าง คลาสทรัพยากรรูทของ Jersey ปกติโดยค่าเริ่มต้นจะถูกสร้างอินสแตนซ์ตามคำขอในขณะที่ Spring เมื่อทรัพยากรถูกใส่คำอธิบายประกอบด้วย @Component มันจะเป็นซิงเกิลตัน กล่าวคือมีเพียงอินสแตนซ์เดียวสำหรับอายุการใช้งานของ JVM หากคุณต้องการให้ทรัพยากรที่มีการจัดการ Spring มีวงจรชีวิตตามคำขอที่มาพร้อมกับทรัพยากร Jersey ปกติคุณควรเพิ่ม@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST)คำอธิบายประกอบSpring เพิ่มเติมจากคำอธิบายประกอบ @Component การเพิ่มวงจรชีวิตของทรัพยากรจะเป็นไปตามคำขอ