Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring如何知道从何处获取需要注入的代理对象?_Java_Spring - Fatal编程技术网

Java Spring如何知道从何处获取需要注入的代理对象?

Java Spring如何知道从何处获取需要注入的代理对象?,java,spring,Java,Spring,在我的印象中,RmiProxyFactoryBean应该生成一个类型为AccountService的代理对象实例,该实例将被注入到下面代码中SimpleObject实例的AccountService属性中 我不明白的是,为什么XML文件似乎指示Spring将RmiProxyFactoryBean类型的对象注入accountService对象实例的SimpleObject属性?我希望XML文件中有一条明确的指令,告诉Spring如何从RmiProxyFactoryBean实例获取AccountSe

在我的印象中,
RmiProxyFactoryBean
应该生成一个类型为
AccountService
的代理对象实例,该实例将被注入到下面代码中
SimpleObject
实例的
AccountService
属性中

我不明白的是,为什么XML文件似乎指示Spring将
RmiProxyFactoryBean
类型的对象注入
accountService
对象实例的
SimpleObject
属性?我希望XML文件中有一条明确的指令,告诉Spring如何从
RmiProxyFactoryBean
实例获取
AccountService
实例,而不是注入
RmiProxyFactoryBean
实例。我觉得这令人困惑

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>
公共类SimpleObject{
私人帐户服务;
公共作废setAccountService(AccountService AccountService){
this.accountService=accountService;
}
}
资料来源: (见17.2.2。)


谢谢

因为代理bean包装了所讨论的对象,所以它们假装是被调用的接口(然后实际上调用该接口)

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)
(仅供示例之用)的方法

如果您正常调用它,那么调用它的方法只会将它推入堆栈。但是,如果example.AccountService对象像上面那样从RmiProxyFactoryBean返回,它将被包装在代理bean中。这个代理bean内部有一个方法,它也被命名为
reconcile
,还有一个
Long amount
参数,这使得它与它包装的原始
示例.AccountService
bean无法区分。通过这种方式,代理bean可以拥有它在
示例.AccountService.confidence(Long amount)
方法之前、之后运行的代码,或者替代实际
示例.AccountService.confidence(Long amount)
方法中的代码

代理bean来自一种完全不同的编程方式,称为面向方面编程(AOP),它处理横切关注点;i、 e.似乎不符合正常OOP关注点分离范围的代码。其中一些问题是事务划分、安全性和日志记录

上面的操作似乎是手动完成的,但有时在运行时使用具有用于选择代理bean并将其应用于现有代码的语言来编写这些操作会更容易


但是,请注意编程到接口,而不仅仅是编程到类

更简洁的说法是,
RmiProxyFactoryBean
实现接口。实现该接口会指示SpringBean工厂该类本身就是一个工厂,导致Spring调用该类上的
getObject()
方法并将结果作为bean返回,而不是创建类本身的实例并返回


所以,简短的回答,这是弹簧的内置机制。

如果我错了,请纠正我……我写这篇文章有点匆忙。谢谢你,leeand00,但我不确定我是否明白你的意思。我问的是Spring如何知道从哪里获取代理对象?我知道代理工厂会生成实现您指定的接口的代理对象,但是Spring如何知道从工厂获取该实例的位置呢?通常,如果您声明一个bean,并且希望告诉Spring如何实例化一个对象,那么您必须指定它,例如。但在给定的代码中,没有类似的东西。是否像Spring扫描工厂中的所有方法,看看它是否可以返回与bean属性匹配的类型,如果可以,则将其注入?@supertonsky我明白你的意思,你指定的是接口,而不是实现。这可能与bean的命名/类的命名有关…(叹气,如果我没记错的话…)在Spring中有一个叫做Autowiring的东西可能就在这背后…有人能证实这一点吗?@supertonsky我明白你的意思,你指定了一个接口,而不是一个实现。这可能与bean的命名/类的命名有关…(叹气,如果我没记错的话…)在Spring中有一个叫做Autowiring的东西,它可能就在这背后…有人能证实这一点吗?Spring在幕后做了大量的工作,做了大量的元编程……实际上看到了这个问题:(参见第一个场景)