đậu proxy phạm vi mùa xuân


98

Ai đó có thể giải thích cách sử dụng của @ScopedProxychú thích mùa xuân ? Tôi nghĩ rằng nó có liên quan gì đó đến các hạt đậu trong phạm vi phiên, nhưng tôi không chắc lắm.

Trong cách sử dụng phạm vi của tôi, tôi đã sử dụng đậu phạm vi phiên mà không có @ScopedProxychú thích (hoặc không có proxy aop phạm vi), vì vậy tôi thực sự chắc chắn cách sử dụng nó đúng cách.


kiểm tra các tài liệu đậu . Phiên là một trong những phạm vi , nhưng không phải là duy nhất.
Gus

1
@Gus, tôi nhận thức được phạm vi, chỉ không chắc chắn cách scoped lượt proxy vào đó
Jeff Storey

1
Theo ý kiến ​​của tôi, Phần 3.4.4.5 là một giải thích khá tốt về chức năng của một proxy theo phạm vi. - bit ở giữa hai ví dụ là phần quan trọng.
Gus

2
Vâng, điều đó giải thích nó, cảm ơn. Nếu bạn muốn thêm câu trả lời cho câu hỏi, tôi sẽ chấp nhận.
Jeff Storey

Câu trả lời:


248

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>

Vì vậy, khi tôi sử dụng chú thích @ScopedProxy, một Proxy sẽ tự động được sử dụng, và đây là tất cả? ScopedProxy có nghĩa là -> Không sử dụng lớp này như nó vốn có, sử dụng Proxy cho nó?
Koray Tugay

3
Tôi đang sử dụng spring-web: 4.3.3 và có vẻ như chú thích @ScopedProxyđã được thay thế bằng @RequestScopevà các chú thích khác. Bạn có thể tìm thấy các ví dụ ở đây: logicbig.com/tutorials/spring-framework/spring-core/…
adebasi

1
Chúng ta có thể nói khi ký hiệu @Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS)được sử dụng, SpringMVC không sử dụng WebApplicationContext cho Tự động, thay vào đó nó sử dụng CGLIB để tạo proxy ?. Dưới đây giải thích khác với các ví dụ ra
Kurapika

0

Sau khi thử nhiều tùy chọn khác nhau được chỉ định ở đây và tài liệu mùa xuân, tôi đã tìm ra lý do nào đó Spring MVC, là bộ điều khiển tự động phân phối ngẫu nhiên khi bạn sử dụng chú thích @Controller và nơi bạn có nhiều bộ điều khiển như vậy trong ứng dụng web của mình. Đã sửa đổi chú thích thành @RestController (value = "UniqueControllerv1"), sự cố đã được giải quyết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.