2011-09-30 47 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

相关问题