สปริงพร็อกซีถั่ว


98

ใครช่วยอธิบายการใช้งาน@ScopedProxyคำอธิบายประกอบฤดูใบไม้ผลิได้ไหม ฉันคิดว่ามันเกี่ยวข้องกับเซสชันสโคปถั่ว แต่ฉันไม่ค่อยแน่ใจ

ในการใช้งานขอบเขตของฉันฉันได้ใช้ Session Scoped Beans โดยไม่มี@ScopedProxyคำอธิบายประกอบ (หรือไม่มีพร็อกซีที่กำหนดขอบเขต aop) ดังนั้นฉันจึงแน่ใจว่าจะใช้อย่างไรอย่างถูกต้อง


ตรวจสอบเอกสารถั่ว เซสชันเป็นหนึ่งในขอบเขตแต่ไม่ใช่เพียงขอบเขตเดียว
กัส

1
@ กัสฉันตระหนักถึงขอบเขตเพียงไม่แน่ใจว่าพร็อกซีที่กำหนดขอบเขตมีบทบาทอย่างไร
Jeff Storey

1
ส่วนที่ 3.4.4.5อยู่ในความคิดของฉันเป็นคำอธิบายที่ค่อนข้างดีเกี่ยวกับสิ่งที่พร็อกซีที่กำหนดขอบเขตทำ - บิตที่อยู่ระหว่างสองตัวอย่างเป็นส่วนสำคัญ
กัส

2
ใช่ที่อธิบายมันขอบคุณ หากคุณต้องการเพิ่มคำตอบสำหรับคำถามฉันจะยอมรับ
Jeff Storey

คำตอบ:


249

ส่วนที่ 3.4.4.5ของเอกสารสปริงอธิบายไว้ค่อนข้างดี:

(โปรดทราบว่านิยาม bean 'userPreferences' ต่อไปนี้ตามที่ย่อมาไม่สมบูรณ์)

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

<bean id="userManager" class="com.foo.UserManager">
    <property name="userPreferences" ref="userPreferences"/>
</bean>

จากการกำหนดค่าข้างต้นจะเห็นได้ว่า 'userManager' ของ singleleton bean ถูกแทรกด้วยการอ้างอิงถึง HTTP Session-scoped bean 'userPreferences' จุดสำคัญที่นี่เป็นที่'userManager' ถั่วเดี่ยว ... มันจะinstantiated ครั้งว่าต่อภาชนะ , และพึ่งพา (ในกรณีนี้เพียงหนึ่งถั่ว 'userPreferences') นอกจากนี้ยังจะได้รับการฉีด (ครั้งเดียว! ) .

ซึ่งหมายความว่า 'userManager' จะ (ตามแนวความคิด) จะดำเนินการกับอ็อบเจ็กต์ 'userPreferences' เดียวกันเท่านั้นนั่นคืออ็อบเจ็กต์ที่ถูกแทรกในตอนแรก

นี่ไม่ใช่สิ่งที่คุณต้องการเมื่อคุณฉีด HTTP Session-scoped bean เป็นการอ้างอิงลงในอ็อบเจ็กต์การทำงานร่วมกัน (โดยทั่วไป) แต่สิ่งที่เราต้องการคืออ็อบเจ็กต์ 'userManager' เดียวต่อคอนเทนเนอร์จากนั้นตลอดอายุการใช้งานของ HTTP Session เราต้องการดูและใช้ออบเจ็กต์ 'userPreferences' ที่เฉพาะเจาะจงสำหรับ HTTP Sessionดังกล่าว

แต่สิ่งที่คุณต้องการคือการฉีดวัตถุบางประเภทที่แสดงอินเทอร์เฟซสาธารณะเดียวกันกับคลาส UserPreferences (โดยหลักการแล้วจะเป็นอ็อบเจ็กต์ที่เป็นอินสแตนซ์ UserPreferences) และฉลาดพอที่จะปิดและดึงอ็อบเจ็กต์ UserPreferences จริง จากกลไกการกำหนดขอบเขตที่เราเลือกไว้ (คำขอ HTTP เซสชัน ฯลฯ ) เราสามารถได้อย่างปลอดภัยแล้วฉีดวัตถุพร็อกซี่นี้ลงใน 'userManager' ถั่วซึ่งจะเป็นสุขสันต์ไม่รู้ว่า UserPreferences อ้างอิงว่ามันถือไว้เป็นพร็อกซี่

ในกรณีของเราเมื่ออินสแตนซ์ UserManager เรียกใช้เมธอดบนอ็อบเจ็กต์ UserPreferences ที่ฉีดขึ้นต่อกันมันจะเรียกใช้เมธอดบนพร็อกซีจริงๆ ... พร็อกซีจะดับและดึงอ็อบเจ็กต์ UserPreferences จริงจาก (ในกรณีนี้) HTTP Session และมอบหมายการเรียกใช้เมธอดไปยังอ็อบเจ็กต์ UserPreferences ที่ดึงมาจริง

นั่นคือเหตุผลที่คุณต้องมีการกำหนดค่าต่อไปนี้ถูกต้องและสมบูรณ์เมื่อฉีด request-, session- และ globalSession-scoped beans ลงในอ็อบเจ็กต์การทำงานร่วมกัน:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
    <aop:scoped-proxy/>
</bean>

<bean id="userManager" class="com.foo.UserManager">
    <property name="userPreferences" ref="userPreferences"/>
</bean>

ดังนั้นเมื่อฉันใช้คำอธิบายประกอบ @ScopedProxy พร็อกซีจะถูกใช้โดยอัตโนมัติและทั้งหมดนี้คืออะไร? ScopedProxy หมายถึง -> ไม่ใช้คลาสนี้เหมือนเดิมใช้ Proxy หรือไม่?
Koray Tugay

3
ฉันใช้ spring-web: 4.3.3 และดูเหมือนว่าจะมีการ@ScopedProxyแทนที่คำอธิบายประกอบ@RequestScopeและอื่น ๆ สามารถดูตัวอย่างได้ที่นี่logicbig.com/tutorials/spring-framework/spring-core/…
adebasi

1
เราสามารถพูดได้ว่าเมื่อใช้สัญกรณ์@Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS)SpringMVC ไม่ได้ใช้ WebApplicationContext สำหรับ Autowired แต่ใช้ CGLIB เพื่อสร้างพร็อกซี? นี่คือคำอธิบายที่อื่น ๆ ที่มีตัวอย่างออก
คุราปิก้า

0

หลังจากลองใช้ตัวเลือกต่างๆที่ระบุไว้ที่นี่และเอกสารประกอบในฤดูใบไม้ผลิฉันพบว่า Spring MVC ด้วยเหตุผลบางประการเป็นตัวควบคุมการเดินสายไฟอัตโนมัติอย่างชาญฉลาดเมื่อคุณใช้คำอธิบายประกอบ @Controller และคุณมีคอนโทรลเลอร์ดังกล่าวมากกว่าหนึ่งตัวในเว็บแอปของคุณ แก้ไขคำอธิบายประกอบเป็น @RestController (value = "UniqueControllerv1") ปัญหาได้รับการแก้ไข

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