2011-09-30 20 views
5

Để hiển thị của tôi, RmiProxyFactoryBean được cho là tạo ra một đối tượng proxy có kiểu AccountService sẽ được tiêm vào accountService thuộc tính của SimpleObject thể hiện trong đoạn mã sau.Làm thế nào để Xuân biết nơi cần lấy đối tượng proxy cần được tiêm?

Điều tôi không hiểu là tại sao tệp XML có vẻ hướng dẫn Spring tiêm một đối tượng thuộc tính RmiProxyFactoryBean loại accountService của cá thể đối tượng SimpleObject? Tôi đang mong đợi một hướng dẫn rõ ràng từ tệp XML cho Spring biết cách lấy một cá thể AccountService từ ví dụ RmiProxyFactoryBean thay vì tiêm một cá thể RmiProxyFactoryBean. Tôi thấy điều này khó hiểu.

public class SimpleObject { 

    private AccountService accountService; 

    public void setAccountService(AccountService accountService) { 
     this.accountService = accountService; 
    } 
} 


<bean class="example.SimpleObject"> 
    <property name="accountService" ref="accountService"/> 
</bean> 

<bean id="accountService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> 
    <property name="serviceUrl" value="rmi://HOST:1199/AccountService"/> 
    <property name="serviceInterface" value="example.AccountService"/> 
</bean> 

Nguồn: http://static.springsource.org/spring/docs/2.5.x/reference/remoting.html (xem 17.2.2).

Cảm ơn

Trả lời

1

Cách gọn gàng hơn là đặt RmiProxyFactoryBean triển khai giao diện FactoryBean. Việc thực hiện giao diện đó chỉ thị cho nhà máy bean Spring rằng lớp này là bản thân nhà máy, làm cho Spring gọi phương thức getObject() trên lớp đó và trả về kết quả là bean, chứ không phải tạo ra một cá thể của lớp và trả về.

Vì vậy, câu trả lời ngắn gọn, đó là một thợ cơ khí tích hợp của Spring.

+0

Trông hoàn hảo, cảm ơn Peter – supertonsky

5

Bởi vì Proxy Đậu quấn đối tượng trong câu hỏi, họ giả vờ là giao diện đang được gọi là (và sau đó sau đó thực sự gọi giao diện đó).

RmiProxyFactoryBean trả về đối tượng proxy để khi mã của bạn cho rằng nó đang gọi phương thức trên lớp example.AccountService của bạn, nó thực sự được gọi trên một bean có cùng giao diện như giao diện example.AccountService như được chỉ định tại đây:

<bean id="accountService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> 
    ... 
    <property name="serviceInterface" value="example.AccountService"/> 
</bean> 

Giả sử có một phương pháp trên giao diện gọi example.AccountService.reconcile(Long amount) (chỉ vì lợi ích của ví dụ) ...

Nếu bạn gọi này thường là phương pháp gọi đó sẽ chỉ đẩy nó vào trong ngăn xếp. Nhưng nếu đối tượng example.AccountService được trả về từ RmiProxyFactoryBean như nó ở trên, nó sẽ được bọc trong một bean proxy. Hạt proxy này có một phương thức bên trong nó cũng được đặt tên là reconcile và cũng có một đối số là Long amount, làm cho nó không thể phân biệt được với hạt gốc example.AccountService mà nó kết thúc tốt đẹp. Bằng cách này, bean proxy có thể có mã mà nó chạy, trước, sau hoặc thay vì mã trong phương thức thực tế example.AccountService.reconcile(Long amount).

Hạt proxy đến từ một cách hoàn toàn khác của chương trình được gọi là Lập trình hướng Aspect (AOP) có liên quan đến các mối quan tâm chéo; tức là mã không rõ ràng có vẻ vừa vặn trong giới hạn của sự phân tách OOP bình thường. Một số trong những mối quan tâm này là Ví dụ, phân giới giao dịch, bảo mật và ghi nhật ký.

Có vẻ như bạn đang làm điều này khá thủ công ở trên, nhưng đôi khi dễ dàng dệt những thứ này trong thời gian chạy bằng cách sử dụng SpringAOP có ngôn ngữ để chọn và áp dụng hạt proxy cho mã hiện có.

Tuy nhiên, lưu ý chương trình cho giao diện thay vì chỉ lập trình cho các lớp học.

+0

Hãy sửa tôi nếu tôi sai ... Tôi đã viết một chút vội vã. – leeand00

+0

Cảm ơn leeand00, nhưng tôi không chắc chắn nếu tôi rõ ràng nhận được quan điểm của bạn. Những gì tôi hỏi là làm sao Spring biết được nơi để lấy đối tượng proxy? Tôi biết rằng nhà máy sản xuất proxy tạo ra đối tượng proxy thực hiện giao diện mà bạn đã chỉ định, nhưng làm thế nào để Spring biết nơi để lấy trường hợp này từ nhà máy? Thông thường nếu bạn khai báo một bean và bạn muốn cho Spring biết cách tạo một đối tượng, bạn phải chỉ định nó, ví dụ: . Nhưng trong đoạn mã đã cho, không có thứ gì giống như thế. – supertonsky

+0

Có phải Spring đang quét tất cả các phương thức từ nhà máy của bạn và xem liệu nó có thể trả về một loại phù hợp với đặc tính của bean của bạn và tiêm nó không? – supertonsky

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