我在带有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”但在此之后我得到了很多相同的帧。所以这不满足我
答案 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对象池来汇集这些代理。