2011-09-30 126 views
5

在我的印象中,RmiProxyFactoryBean應該產生一個類型爲AccountService的代理對象實例,它將在SimpleObject實例的accountService屬性中注入以下代碼。Spring如何知道代理對象需要注入哪裏?

我不明白爲什麼XML文件似乎指示Spring將RmiProxyFactoryBean類型的對象注入accountServiceSimpleObject對象實例的屬性?我在等,告訴Spring是如何從RmiProxyFactoryBean實例得到AccountService實例,而不是注入RmiProxyFactoryBean實例的XML文件的明確指令。我覺得這很混亂。

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> 

來源: http://static.springsource.org/spring/docs/2.5.x/reference/remoting.html (見17.2.2。)

由於

回答

1

把它的更簡潔的方式是,RmiProxyFactoryBean實現FactoryBean接口。實現該接口責成的Spring bean工廠,這個類是工廠本身,造成春季來調用這個類的getObject()方法並返回結果作爲bean,而不是創建類本身的實例並返回。

所以,簡單的答案,這是春天的一個內置的技工。

+0

看起來很完美,謝謝彼得 – supertonsky

5

因爲代理豆類包裹有問題的對象,他們假裝是被調用的接口(以及然後後來實際上調用該接口)。

的RmiProxyFactoryBean返回一個代理對象,這樣當你的代碼,認爲它呼籲您example.AccountService類中的方法,它實際上是被稱爲與相同的接口你example.AccountService接口的bean如下規定:

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

說有一個叫example.AccountService.reconcile(Long amount)(只是舉例的緣故)的接口上的一個方法...

如果你把這種正常的方法調用它只能將其推入堆棧。但是,如果像上面那樣從RmiProxyFactoryBean返回example.AccountService對象,它將被包裝在一個代理bean中。該代理bean有它也命名爲reconcile內的方法,也有Long amount的說法,這使得它從原來的example.AccountService豆其包裝沒有區別。通過這種方式,代理bean可以在代碼之前,之後或代替實際的example.AccountService.reconcile(Long amount)方法中的代碼。

代理豆來自編程稱爲面向方面編程(AOP),它與交叉,關注交易的一個完全不同的方式;即在正常OOP分離問題的範圍內看起來不太適合的代碼。其中一些擔憂是例如事務劃分,安全性和日誌記錄。

看來,你是寧願手動上面這樣做,但它有時更容易在使用SpringAOP這對於選擇和應用代理豆現有代碼語言運行時編織這些。

但是,請注意對接口進行編程,而不是程序只是類。

+0

如果我錯了,請糾正我......我已經寫了這個草率。 – leeand00

+0

謝謝leeand00,但我不確定我是否清楚地明白你的觀點。我問的是Spring如何知道在哪裏獲取代理對象?我知道代理工廠生成的代理對象實現了您指定的接口,但Spring如何知道從工廠獲取此實例的位置?通常如果你聲明一個bean並且你想告訴Spring如何實例化一個對象,你必須指定它,例如。但是在給定的代碼中,沒有這樣的東西。 – supertonsky

+0

它是否像Spring一樣掃描工廠中的所有方法,並查看它是否可以返回與您的bean的屬性相匹配的類型,並在它注入時注入它? – supertonsky

相關問題