我可以使用 lazy-init 运行 RmiServiceExporter 吗?

Can I get working RmiServiceExporter with lazy-init?

我有一个遗留项目,在几个上下文中有很多 beans。似乎 bean 之间存在循环依赖关系,这就是为什么大多数上下文将 default-lazy-init 设置为 true.

的原因

我需要通过 RMI 导出一些 bean,因此我在上下文中有以下声明:

<bean id="partnershipPluginService" class="com.otr.sufd.services.security.PartnershipPluginServiceImpl" lazy-init="false">
    <property name="selectionService" ref="selectionService"/>
    <property name="editObjectService" ref="editObjectService"/>
    <property name="securityFieldsService" ref="securityFieldsService"/>
    <property name="cryptoSettingsService" ref="cryptoSettingsService"/>
    <property name="authenticationService" ref="systemAuthenticationService"/>
    <property name="configurationManager" ref="serverConfigurationManager"/>
    <property name="lifeCycleDefService" ref="lifeCycleDefService"/>
</bean>

<bean class="org.springframework.remoting.rmi.RmiServiceExporter" depends-on="partnershipPluginService" lazy-init="false">
    <property name="registryPort" value="${rmi.port}"/>
    <property name="serviceName" value="partnershipPluginService"/>
    <property name="serviceInterface" value="com.otr.security.synchronization.service.PartnershipPluginService"/>
    <property name="service" ref="partnershipPluginService"/>
</bean>

这两个 bean 都声明为非惰性。我认为,足以将至少一个 RmiServiceExporter 声明为非懒惰以具有相同的行为。 在这种配置中有一个很大的缺点。它不起作用。我在上下文创建过程中遇到异常

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'partnershipSystemPluginService' defined in class path resource [security/serverSecurityServices.xml]: Cannot resolve reference to bean 'cryptoSettingsService' while setting bean property 'cryptoSettingsService'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'cryptoSettingsService': Bean with name 'cryptoSettingsService' has been injected into other beans [jinnCryptoService,jinnCryptoServerService] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.

乍一看,jinnCryptoServicejinnCryptoServerService之间没有循环依赖。如果我让 RmiServiceExporterpartnershipPluginService 像其他人一样懒惰 - 上下文创建无一例外,但 RMI 不起作用。 那么,有什么方法可以使上下文和 RMI 正常工作吗?感谢您帮助我并浪费您的时间。

所以,我找到了解决办法。 我查看了上下文的邻域,并得到了一些带有像 RmiServiceExporter 这样的 bean 的上下文。该上下文不是惰性的,并且在具有像 partnershipPluginService 这样的 bean 的惰性上下文之后开始。 我将 RmiServiceExporter 替换为新的上下文,问题就解决了。

如果你和我一样,请从不同的角度看问题,然后找到答案。

感谢所有阅读本文 post 并试图帮助我的人。