Java 如何从应用程序上下文中删除bean对象?
我正在用JavaSE和spring框架创建一个应用程序。我在应用程序上下文中定义了一些框架:Java 如何从应用程序上下文中删除bean对象?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在用JavaSE和spring框架创建一个应用程序。我在应用程序上下文中定义了一些框架: ApplicationContext actx = new FileSystemXmlApplicationContext(args[0]); context.xml: <bean id="NewRouteFrame" class="newRoute.frame.NewRouteFrame" lazy-init="true" /> <bean id="NewCont
ApplicationContext actx = new FileSystemXmlApplicationContext(args[0]);
context.xml:
<bean id="NewRouteFrame" class="newRoute.frame.NewRouteFrame"
lazy-init="true"
/>
<bean id="NewControllerFrame" class="newController.frame.NewControllerFrame"
lazy-init="true"
/>
但是spring仍然缓存一个帧。当我使用关键字创建普通帧时
new MyJFrame();
处理工作是正确的。但是,通过spring上下文,情况并非如此!。我可以在context.xml中设置scope=“prototype”,spring将创建新的框架,但旧的框架仍然存在,从而产生许多相同的框架。如何可能摧毁目标?。我想使用侦听器关闭窗口操作从spring上下文销毁对象,例如:
addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent e) {
// here destroy bean from context, but how???
}
});
}
在这个问题上,我将全力寻求帮助
更新
我不使用@Authowire注释。我使用以下方法获得简单bean:
appContext.getBean(MyFrame.class);
我的问题是,我不知道如何删除appContext中已经存在的对象(frame),然后再次调用新的MyJFrame(fresh)对象。我如何在上面写我可以使用scope=“prototype”,但在这之后,我得到了很多相同的框架。所以这不是我的满足感
我可以在context.xml中设置scope=“prototype”
,这样spring就会创建新的
帧,但旧帧仍然存在,导致许多相同的帧。怎么样
有可能摧毁这个物体吗
当您使用prototype作用域时,由您来处理对象。Spring不会也不能为您处理原型范围的bean。调用getBean
检索原型作用域bean时,需要保留对该对象的引用并正确处理它。可以使用原型作用域和Spring的销毁方法配置告诉Spring在处理对象时调用特定方法。该方法必须在该类中定义
见:
例如:
然后,如果愿意的话,可以使用Spring对象池将这些代理汇集在一起。解决问题的最佳方法不是从应用程序上下文中删除bean,而是使用JDialog而不是JFrame
结果,用户无法聚焦其他打开的帧(例如,您已经实现了打开实际帧的按钮),并且在未关闭实际聚焦(打开的帧)之前无法创建新的JFrame
例如:
用户打开您的NewRouteName(但JDialog实现)然后关闭它,并希望再次打开相同的框架,然后spring为用户提供新的NewRouteName(JDialog实现)。现在,用户希望打开同一帧(不关闭实际打开的帧),但在不关闭实际帧之前,他不能(JDialog阻止应用程序中的其他聚焦帧)
有关JDialog的更多信息,请访问:
http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html
我想你能找到答案
<bean id="NewControllerFrame" class="newController.frame.NewControllerFrame"
scope="prototype" destroy-method="cleanup" />
public class MyJFrameProxy extends JFrame
{
private MyJFrame proxiedObject;
public void setVisible(boolean visible)
{
proxiedObject.setVisible(visible);
}
public void show()
{
proxiedObject.show();
}
public void cleanup()
{
proxiedObject.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
}
}
http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html