使用SpringIOC在两个窗体之间共享java对象

使用SpringIOC在两个窗体之间共享java对象,java,spring,Java,Spring,我想使用SpringIOC在两个表单之间共享java对象。它的作用应类似于注册表: Registry.set("key", new Object()); // ... Object o = Registry.get("key"); // ... Registry.set("key", new AnotherObject()); // rewrite old object 我尝试了以下代码在运行时注册bean: applicationContext.getBeanFactory().regist

我想使用SpringIOC在两个表单之间共享java对象。它的作用应类似于注册表:

Registry.set("key", new Object());
// ...
Object o = Registry.get("key");
// ...
Registry.set("key", new AnotherObject()); // rewrite old object
我尝试了以下代码在运行时注册bean:

applicationContext.getBeanFactory().registerSingleton("key", object);
但它不允许重写现有对象(检查和删除现有bean的结果代码太复杂了)


PS我是Java新手,所以mb我做错了,我根本不应该使用IoC。。。非常感谢您的帮助……

我不知道您为什么觉得必须在运行时注册该类。为什么不在工厂中配置它并像其他POJO一样注入它呢


使用这样的共享注册表时要小心。它在乞求线程安全。如果你是Java新手,这是一个充满危险的领域。

你可以随心所欲

要注册新的bean实例,您应该使用

org.springframework.beans.factory.config.SingletonBeanRegistry#registerSingleton

在重新注册对象之前,您应该使用

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#destroySingleton

删除以前注册的bean。这两种方法在具体的BeanFactory实现中都可用


然而,我认为您在试图在运行时定义依赖项时有点误用了Spring。Spring更适合于声明式依赖关系管理,编程方法可能会使事情过于复杂

也可能会泄漏内存,太多的东西被添加进来而从未取出。我必须在运行时配置它(这取决于用户输入)。所以你建议不要使用IoC,而是通过setter/getter手动注入它?我问,因为我使用NetBeans GUI composer,我不确定添加/修改NetBeans生成的代码是否是个好主意……不,我不明白。向注册表添加和删除内容是在运行时完成的,但将其注入需要它的对象是一个配置细节。你说的是哪一个?您可能不应该使用DI。如果您是Java新手,我会说这是一个高级主题,您应该推迟。我经常重新创建该对象(重新创建它要比重新配置它的状态容易得多),所以我理解,每当我重新创建它时,我都需要自己重新导入它(现在我使用ctx.getBean(“name”),并希望用bean“name”替换对象)。这有意义吗?不,对不起,我一点也不明白你的意思。