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

时间:2014-07-20 16:46:26

标签: java spring spring-mvc

我在带有spring框架的java SE中创建一个应用程序。我在应用程序上下文中定义了一些框架:

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" 
/>

有时我想创建一个新的对象框架(破坏旧框架并创建新框架)。

我在窗口关闭后使用dispose方法(我不想要缓存帧):

 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

但春天还在缓存一个框架。当我使用关键字

创建普通帧时
new MyJFrame();

处理工作正确。但是在春天的背景下不是!我可以在context.xml中设置scope =“prototype”,而spring会创建新的Frame,但旧的框架仍然存在,导致许多相同的帧。如何破坏物体?我想使用监听器关闭窗口操作从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中删除已存在的对象(帧),然后再次调用新的MyJFrame(新鲜)对象。我怎么写上面我可以使用scope =“prototype”但在此之后我得到了很多相同的帧。所以这不满足我

3 个答案:

答案 0 :(得分:1)

解决问题的最佳方法是不从应用程序上下文中删除bean,而是使用JDialog而不是JFrame。

结果是,用户无法关注其他已打开的帧(可能已经实现了按钮来打开实际帧),并且在不关闭实际聚焦(打开的帧)之前无法创建新的JFrame。

实施例: 用户打开你的NewRouteFrame(但JDialog实现)比关闭它,并且想要再次打开相同的框架,比spring为用户提供新的NewRouteFrame(JDialog实现)。现在用户希望打开相同的帧(不关闭实际打开)但他不能(JDialog阻止应用程序中的可聚焦其他帧)直到不关闭实际帧。

有关JDialog的更多信息,请访问:

http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html 

答案 1 :(得分:0)

  

我可以在scope="prototype"中设置context.xml而不是spring会创建新的getBean   帧,但旧帧仍然存在导致许多相同的帧。如何   有可能破坏对象吗?

当您使用原型范围时,您可以自行处理该对象。 Spring不会也不能为你处理原型范围的bean。当您调用{{1}}来检索原型范围的bean时,您需要保留对该对象的引用并正确处理它。

答案 2 :(得分:0)

您可以使用原型范围和Spring的destroy-method配置来告诉Spring在完成对象时调用特定方法。必须在该类中定义该方法。

请参阅: http://www.mkyong.com/spring/spring-init-method-and-destroy-method-example/

实施例:     

 <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);
    }
 }

如果愿意,您可以使用Spring对象池来汇集这些代理。