Phần 3.4.4.5 của tài liệu mùa xuân giải thích nó khá tốt:
(xin lưu ý rằng định nghĩa bean 'userPreferences' sau vì nó là viết tắt của nó là không đầy đủ):
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
<bean id="userManager" class="com.foo.UserManager">
<property name="userPreferences" ref="userPreferences"/>
</bean>
Từ cấu hình trên, rõ ràng là singleton bean 'userManager' đang được đưa vào một tham chiếu đến HTTP Session-scoped bean 'userPreferences'. Điểm nổi bật ở đây là đậu 'UserManager' là một singleton ... nó sẽ được khởi tạo đúng một lần mỗi container , và phụ thuộc của nó (trong trường hợp này chỉ có một, đậu 'userPreferences') cũng sẽ chỉ được tiêm (một lần! ) .
Điều này có nghĩa là 'userManager' sẽ (về mặt khái niệm) chỉ hoạt động trên cùng một đối tượng 'userPreferences' chính xác, đó là đối tượng mà nó được đưa vào ban đầu.
Đây không phải là những gì bạn muốn khi bạn đưa một bean có phạm vi phiên HTTP làm phụ thuộc vào một đối tượng cộng tác (thường là). Thay vào đó, những gì chúng tôi muốn là một đối tượng 'userManager' duy nhất trên mỗi vùng chứa và sau đó, trong suốt thời gian tồn tại của Phiên HTTP, chúng tôi muốn xem và sử dụng đối tượng 'userPreferences' cụ thể cho Phiên HTTP đã nói .
Thay vì những gì bạn cần sau đó là chèn một số loại đối tượng hiển thị giao diện công khai giống hệt như lớp UserPreferences (lý tưởng là một đối tượng là một cá thể UserPreferences) và điều đó đủ thông minh để có thể bắt đầu và tìm nạp đối tượng UserPreferences thực. từ bất kỳ cơ chế xác định phạm vi cơ bản nào mà chúng tôi đã chọn (yêu cầu HTTP, Phiên, v.v.). Sau đó, chúng tôi có thể đưa đối tượng proxy này vào bean 'userManager' một cách an toàn, điều này sẽ rất thú vị khi biết rằng tham chiếu UserPreferences mà nó đang giữ là proxy .
Trong trường hợp của chúng tôi, khi một cá thể UserManager gọi một phương thức trên đối tượng UserPreferences được chèn phụ thuộc vào, nó thực sự sẽ gọi một phương thức trên proxy ... proxy sau đó sẽ tắt và tìm nạp đối tượng UserPreferences thực từ (trong trường hợp này) Phiên HTTP và ủy quyền lời gọi phương thức vào đối tượng UserPreferences thực được truy xuất.
Đó là lý do tại sao bạn cần cấu hình, chính xác và đầy đủ sau đây khi đưa các bean theo phạm vi request-, session- và globalSession vào các đối tượng cộng tác:
<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>