2013-03-22 31 views
15

Im sử dụng Jersey Rest và muốn có một bộ lọc Jersey để có quyền truy cập vào một số đậu mùa xuân.Sử dụng proxy-target-class = "true" với Spring bean

tuy nhiên như tôi đã phát hiện ra từ các chủ đề khác, Jersey không nhận được Spring bean nếu chúng là các proxy Java như trái ngược với các proxy java đã tạo. Tôi muốn thêm proxy-target-class = "true"

Tác động của việc thực hiện điều này và điều này chỉ có thể được đặt trên một bean đơn lẻ hoặc cần phải được đặt trên tất cả các bean được tham chiếu?

Trả lời

22

Bằng cách đặt proxy-target-class="true", bạn sẽ sử dụng CGLIB2 cho proxy của mình, thay vì jdk proxys.

Ứng dụng này như sau, như mô tả trong de documentation:

  • phương thức không thể được thông báo, vì họ không thể được ghi đè.

  • Bạn sẽ cần các tệp nhị phân CGLIB 2 trên đường dẫn lớp của mình, trong khi proxy động có sẵn với JDK. Mùa xuân sẽ tự động cảnh báo bạn khi cần CGLIB và các lớp thư viện CGLIB không phải là được tìm thấy trên đường dẫn lớp.

  • Hàm tạo của đối tượng proxy của bạn sẽ được gọi hai lần. Đây là hậu quả tự nhiên của mô hình proxy CGLIB theo đó một lớp con được tạo ra cho mỗi đối tượng được ủy quyền. Đối với mỗi cá thể được ủy quyền, hai đối tượng được tạo: đối tượng được ủy quyền thực tế và một thể hiện của lớp con thực hiện lời khuyên. Hành vi này không được trưng bày khi sử dụng proxy JDK. Thông thường, gọi hàm khởi tạo của loại ủy quyền hai lần, không phải là vấn đề, vì thường chỉ có các bài tập diễn ra và không có logic thực nào được triển khai trong hàm tạo .

Ngoài ra, bạn sẽ có thể thực hiện một "mục tiêu-proxy" cho một thành phần cụ thể bằng cách sử dụng

proxyMode=ScopedProxyMode.TARGET_CLASS 
+1

Lưu ý rằng là một lỗi để tạo ra một proxy AOP-chỉnh phạm vi cho một bean singleton. –

+0

Đó là một ví dụ. Chỉnh sửa để tránh nhầm lẫn. – gargc

+0

nhưng làm thế nào chính xác để tôi đặt nó trên một chiếc đậu? Ví dụ: điều này sẽ không phàn nàn về sự xuất hiện của tham chiếu proxy-target – cduggan

12

Buộc một cglib-Proxy mặc dù bộ điều khiển chính thức thực hiện một giao diện (SpringBoot 1.2.3.RELEASE with Spring 4.1.6.RELEASE):

@Controller 
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class ServiceImpl implements ServiceIntf 
{ .... } 

Điều này cho phép chú thích hợp lệ và làm việc @RequestMapping and @Transactional annotations

4

Sử dụng các chú thích sau đây trong lớp Java Xuân Config:

@EnableAspectJAutoProxy (proxyTargetClass = true)

+0

oh cool ......... bạn đã lưu tôi @ rcde0 – pk4393

Các vấn đề liên quan