我有一個應用程序,在後端部署一個輕量級的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的問題解決了。
但我不明白爲什麼它解決了這個問題或者是什麼問題。
感謝
或多或少我知道這些問題。我只是不明白爲什麼調用'ConnectHandler connectHandler =(ConnectHandler)ApplicationContext.getApplicationCtx()。getBean'會阻止GUI顯示,無論是在EDT內部還是外部EDT.I只想獲得一個bean。如果Spring上下文已經在EDT之外初始化了,那它有什麼關係?Spring不會做與GUI有關的任何事情。它主要連接後端的Jetty服務器 – Cratylus
@ user384706必須有一些代碼,unclodes流,連接,錯過刷新,不管流,文件,連接,沒有關閉,仍然活躍在I/O級別,或錯誤,你調用未初始化的類,返回null,那麼你的GUI是空的解決方案SwingExplorer ,如果返回uninitaized任何,然後JProfiler,很幸運, – mKorbel
「惰性init」觀察呢?一旦我將'lazy-init'設置爲false,代碼就可以正常工作。查看後 – Cratylus