Java 如何从应用程序上下文中删除bean对象?

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

我正在用JavaSE和spring框架创建一个应用程序。我在应用程序上下文中定义了一些框架:

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