2011-11-14 37 views
15

Tôi có một đậu mùa xuân, chúng ta hãy nói:Có thể unproxy một Spring bean không?

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class AImpl implements A { 

    public void setSomeDependency(D dependency) { 
     // This setter DOES NOT BELONG to interface A 
    } 
} 

<bean id="aImpl" class="AImpl"/> 

Bây giờ tôi muốn thử nghiệm tích hợp nó, nhưng trước tiên tôi cần phải thử phụ thuộc D, bởi vì nó quá nhiều thứ. Kể từ khi AImpl thực hiện một giao diện và chứa một chú thích giao dịch, proxy được tạo ra chỉ tương thích với giao diện A, vì vậy tôi có thể làm điều này:

@Inject @Named("aImpl") 
private A a; 

nhưng không thể:

@Inject @Named("aImpl") 
private AImpl a; 

Kết quả là, Tôi không thể chế nhạo sự phụ thuộc của tôi.

Xin lưu ý rằng việc thêm void setSomeDependency(D dependency) vào giao diện A không phải là một tùy chọn vì nó không có ý nghĩa kinh doanh. Nó không sử dụng proxy-target-class="true", vì nó phá vỡ toàn bộ rất nhiều hạt khác (thuộc tính này ảnh hưởng đến tất cả các hạt trong ngữ cảnh).

Có cách nào để loại bỏ đậu được tiêm A, vì vậy tôi có thể truyền số đó đến AImpl không?

+0

có thể trùng lặp của [Truyền đối tượng Proxy của mùa xuân đến lớp thời gian thực tế] (http://stackoverflow.com/questions/5976247/casting-a-springs-proxy-object-to-the-actual-runtime-class) – skaffman

+0

@skaffman: cảm ơn vì đã chỉ ra, tôi đã thêm câu hỏi đó vào Câu hỏi thường gặp về thẻ mùa xuân –

Trả lời

22

Hãy thử điều này:

if(AopUtils.isAopProxy(a) && a instanceof Advised) { 
    Object target = ((Advised)a).getTargetSource().getTarget(); 
    AImpl ai = (AImpl)target; 
} 

Bonus: trong Scala Tôi đang sử dụng các chức năng tương đương sau đây với mục đích rất giống nhau:

def unwrapProxy(a: AnyRef) = a match { 
    case advised: Advised if(AopUtils.isAopProxy(advised)) => 
          advised.getTargetSource.getTarget 
    case notProxy => notProxy 
} 
+8

Cảm ơn, bạn đã thực sự cứu tôi. BTW, tôi mới đến thăm Oslo lần đầu tiên, bây giờ tôi không tự hỏi tại sao bạn dành quá nhiều thời gian cho SO (không có ý nghĩa gì, nhưng thời tiết không đáng khích lệ) :) – MaDa

+2

Vui vì tôi có thể giúp. Tôi thích bình luận của bạn rất nhiều mà tôi thậm chí còn trích dẫn nó trên trang hồ sơ của tôi ;-). –

8

Với sự ra đời của mùa xuân 4.2.RC1, hiện nay một lớp tiện ích chuyên dụng trong mô-đun spring-test xử lý trường hợp này cho bạn.

Các lớp được gọi là AopTestUtils và cung cấp các phương pháp:

  • getTargetObject (unwraps chỉ proxy top-level)
  • getUltimateTargetObject (unwraps nhiều cấp độ của proxy nếu chúng tồn tại).

Kiểm tra commit có liên quan cũng như issue tương ứng.

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