2011-10-09 35 views
1

我有一個應用程序,在後端部署一個輕量級的HTTP服務器(Jetty)。
servlets基本上更新了MySQL數據庫。
我已經使用Spring連線了所有東西。lazy-init =「true」。它是幹什麼的?爲什麼我不能從lazy-init設置爲true的Swing應用程序獲取Spring bean?

到目前爲止確定。

我有一個用戶界面,我想用來與服務器交互。
如果UI在本地運行,我希望它在JTree中顯示當前登錄的用戶。

因此,我決定啓動服務器,即啓動主框架時啓動Spring。

最重要的是,爲了更新UI的JTree,以顯示我認爲使用Observer-Observable的所有登錄用戶,並讓接受連接的代碼爲Observable

ConnectionListener將被通知傳入連接在ArrayBlockingQueue和後臺線程存儲它們(具有參考DefaultMutableTreeNode根)的Jtree會經由SwingUtilities更新它-in當然EDT螺紋的。

我的問題是這樣的:

如果我做的:

public class AdminFrame extends JFrame { 
     public static ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("myBeans");  

public static void main(String[] args){  
     EventQueue.invokeLater(new Runnable() { 
       public void run() { 
     //Show GUI 
     } 
     } 
    } 

的GUI沒有繪製,但我可以理解,因爲一旦啓動春季和服務器啓動該線程不會返回。

於是我開始春天在後臺線程,如下:

public class ServerThread extends Thread { 
    @Override 
    public void run() { 
    ClassPathXmlApplicationContext ctx = ApplicationCtx.getApplicationCtx(); 
    } 
} 

public class ApplicationCtx { 

    private static ClassPathXmlApplicationContext ctx; 
    private ApplicationCtx(){} 
    public static synchronized ClassPathXmlApplicationContext getApplicationCtx(){ 
    if(ctx == null){ 
    ctx = new ClassPathXmlApplicationContext("myBeans.xml"); 
    } 
    return ctx; 
} 

}

的GUI現在顯示出來,似乎確定,但我錯過了通知。

問題:

這是不可能得到通知新的連接:

1)如果我註冊通知如下:

public class AdminFrame extends JFrame { 
    public static void main(String[] args) { 
     ServerThread lightweightServer = new ServerThread(); 
     lightweightServer.start(); 
     Thread.sleep(9000);//Temporary solution to make sure the server is started up before GUI 
     ConnectHandler connectHandler = (ConnectHandler) ApplicationContext.getApplicationCtx().getBean("connectHandler"); 
     connectHandler.addObserver(new ConnectionListener()); 
     EventQueue.invokeLater(new Runnable() { 
     public void run() { 
       //SHOW GUI 
       } 
     } 

的GUI一直沒有出現。如果我刪除該行:

ConnectHandler connectHandler = (ConnectHandler) ApplicationContext.getApplicationCtx().getBean("connectHandler"); 

GUI顯示出來。 2)如果我在EDT內部註冊,即在AdminFrame的構造函數內部,GUI也不會顯示出來。
I.e.

public class AdminFrame extends JFrame { 
    public static void main(String[] args) { 
     ServerThread lightweightServer = new ServerThread(); 
     lightweightServer.start(); 
     Thread.sleep(9000);//Temporary solution to make sure the server is started up before 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 

     AdminFrame frame = new AdminFrame(); 
     //Other code 

     } 

再次,如果我刪除以下行的GUI顯示出來,但這種方式我不能註冊接收通知:

ConnectHandler connectHandler = (ConnectHandler) ApplicationContext.getApplicationCtx().getBean("connectHandler"); 

這必須是一個線程的問題,但我不明白是什麼問題。
爲什麼第二次調用Spring應用程序上下文來獲取ConnectHandler使線程不能返回?
我在這裏做錯了什麼?


UPDATE:

,如果我在Spring配置文件中的屬性lazy-init="true"添加到啓動Jetty服務器bean的問題解決了。
但我不明白爲什麼它解決了這個問題或者是什麼問題。

感謝

回答

1
  • SerializableObservate需要包木窗GUI rellated代碼到(在大多數情況下)invokeAndWait()

  • 輸出SwingWorker(因爲有保證,但我看到某些情況下不工作,因爲我期待)或Runnable#Thread要求強姦GUI相關代碼到invokeLater()

  • you ca n準備好你的圖形用戶界面(之後有EDT存在),並且知名度爲

JFrame#pack(); 
JFrame#setVisible(true); 

Container你不得不在屋裏invokeXxx();調用或最好是從javax.swing.Action()

+0

或多或少我知道這些問題。我只是不明白爲什麼調用'ConnectHandler connectHandler =(ConnectHandler)ApplicationContext.getApplicationCtx()。getBean'會阻止GUI顯示,無論是在EDT內部還是外部EDT.I只想獲得一個bean。如果Spring上下文已經在EDT之外初始化了,那它有什麼關係?Spring不會做與GUI有關的任何事情。它主要連接後端的Jetty服務器 – Cratylus

+0

@ user384706必須有一些代碼,unclodes流,連接,錯過刷新,不管流,文件,連接,沒有關閉,仍然活躍在I/O級別,或錯誤,你調用未初始化的類,返回null,那麼你的GUI是空的解決方案SwingExplorer ,如果返回uninitaized任何,然後JProfiler,很幸運, – mKorbel

+0

「惰性init」觀察呢?一旦我將'lazy-init'設置爲false,代碼就可以正常工作。查看後 – Cratylus

0

如果設置延遲實例來真正解決您的問題,我認爲它沒有徹底解決。

默認情況下,所有的bean在啓動時初始化,所以如果任何一個bean沒有正確初始化,就會在啓動時出現問題。

如果將其設置爲false,則不會調用bean,並且不會面對任何isssue。所以這個問題沒有解決,但推遲。

相關問題