Spring 6中已弃用的RmiRegistryFactoryBean如何替换?求替代方案
Spring 6中RmiRegistryFactoryBean的替代方案
在Spring 6里,org.springframework.remoting.rmi.RmiRegistryFactoryBean已被弃用,以下是适配你原有配置场景的替代方案:
1. 编程式显式创建RMI注册表(对应原单独定义Registry的场景)
如果需要像原来那样单独创建并管理RMI注册表实例,直接用JDK原生API配合Spring的@Bean实现即可,行为和原FactoryBean保持一致:
import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RmiRegistryConfig { @Bean(destroyMethod = "unbind") public Registry rmiRegistry() throws Exception { // 指定8989端口创建注册表,端口被占用会抛出异常 return LocateRegistry.createRegistry(8989); } }
这里的destroyMethod = "unbind"用于容器销毁时清理注册表资源,和原FactoryBean的销毁逻辑对齐。
2. XML配置替代(若你仍偏好XML配置)
如果不想切换到Java配置,也可以用XML的factory-method直接调用JDK的创建方法,替换原来的bean定义:
<bean id="rmiRegistry" class="java.rmi.registry.LocateRegistry" factory-method="createRegistry"> <constructor-arg value="8989"/> </bean>
额外场景:仅为发布RMI服务时的简化方案
如果创建注册表只是为了发布RMI服务,其实无需单独定义Registry bean,直接用RmiServiceExporter的自动创建能力即可——它会在指定端口不存在注册表时自动创建:
@Configuration public class RmiServiceExportConfig { @Bean public RmiServiceExporter rmiServiceExporter(YourBusinessService service) throws Exception { RmiServiceExporter exporter = new RmiServiceExporter(); exporter.setService(service); exporter.setServiceName("YourBusinessService"); exporter.setServiceInterface(YourBusinessServiceInterface.class); exporter.setRegistryPort(8989); // 自动创建该端口的注册表 return exporter; } }
注意事项
- 确保目标端口未被占用,否则
createRegistry会抛出异常;若需复用已存在的注册表,可改用LocateRegistry.getRegistry(8989),但要处理注册表不存在的异常情况 - 生产环境建议设置
java.rmi.server.hostname系统属性,避免RMI主机名解析问题
内容的提问来源于stack exchange,提问作者venkatesh giriyappa
相关产品推荐
相关产品推荐

