ส่วนที่ 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>