2016-02-12 137 views
1

這是我第一次嘗試用Spring編寫一個swing應用程序(僅基於java的配置,我不需要XML)。問題是我不知道如何自動裝載需要參數的bean,在我的應用程序中,我將創建大量的JPanel(以及LineBorder等),並且我正在努力尋找正確的方法做這個。我應該創建一個將返回一個簡單的JButton的bean定義,將範圍設置爲「prototype」,自動調用它,並在我的GUI類中完成所有初始化?基於Java的配置,帶參數的自動裝配bean

在Swing應用程序

此外,應利用春季創造一切嗎?(不是一個單一的「新的」我的配置類的外關鍵字),就像當我有

linebuttonPanel.setPreferredSize(new Dimension(0, 70)); 

我應該不是寫一個方法返回一個像這樣的新維度bean?

Dimension d = context.getBean("dimension"); 
d.setSize(0, 70); 
linebuttonPanel.setPreferredSize(d); 

或者我應該移動的尺寸初始化到配置類,並用此

linebuttonPanel.setPreferredSize(context.getBean("dimension", 0, 70)); 

我試圖用@Autowire儘可能這是我遇到的問題,這裏是第一選項,其中我需要以某種方式提供的說法,而自動裝配

enter image description here

第二個選項是實現Applicati onContextAware和使用getBean方法,但這是如何爲每個bean做到這一點的正確方法?

enter image description here

+0

你有沒有考慮,而混合彈簧和擺動,你可能會遇到的線程問題? Swing要求您尊重其線程模型(Event Dispatch Thread),並且在將組件創建委派給Spring時可能很難控制。在我們的項目中,在客戶端,我們只使用Spring來實現由Swing組件調用的服務,但我們保持對所有組件生命週期的控制。並不是說這是不可能實現的,但是那裏的教程似乎完全忽略了這一點。 –

+0

不幸的是'@ Autowared'不支持傳遞參數。所以,你的第二種方法已經足夠好了,但是請注意:不要實現'ApplicationContextAware'接口。只需使用@Autowired註釋標記類的ApplicationContext屬性即可。此註釋旨在簡化對象的綁定,包括實現所有「Aware」接口。 –

回答

0

時,你必須創建按鈕,你需要的應用程序上下文的訪問。

您可以將ApplicationContext自動裝入您的bean並從那裏查找Button bean,但這是非常糟糕的想法。您不應該將整個應用程序上下文注入到特定的bean中,它會打破彈簧設計的鬆散耦合思想。

因此,您最好從GUI類定義中刪除ApplicationContextAware接口,並刪除ApplicationContext applicationContext類字段。

在這種情況下,最好使bean創建操作abstract並在基於java的應用程序配置中實現它們。

我的意思是,你可以定義抽象方法

protected abstract JButton getButton(String name) 
GUI

,所以類將成爲抽象的爲好。

然後你就可以做一個bean定義在當前的配置如下:

@Bean 
public GUI gui() { 
    return new GUI() { 
     @Override 
     protected JButton getButton(String name) { 
      // note, here you're referencimg your Bean jButton of scope "prototype" 
      return jButton(name); 
     } 
    } 
} 
+0

如果我有帶註釋@Bean和@Scope(「prototype」)的JTextField的bean定義,並且在它內部創建並添加新的KeyAdapter,我必須爲該適配器創建一個單獨的bean定義,該定義也將被標記作爲@Scope(「prototype」)並引用它,或者僅僅寫JTextField field = new JTextField()就足夠了。 field.addKeyListener(new KeyAdapter(){}); ? – Peter

+0

@Peter,簡而言之,如果您需要在您的應用程序中創建許多嵌套對象,那麼使用bean定義很難做到這一點。我描述瞭如何將原型注入單例的通用機制。爲了避免bean的定義,最好在代碼中使用簡單的構造函數,並且不要使用bean來創建應用程序中的每個對象。 –

+0

這裏不需要執行lookup-method。這種方法仍然不能解決將參數傳遞給構造函數的問題。因爲需要調用'BeanFactory'的方法來創建新的bean,所以我們不會從創建lookup-method –

0

我可能會使用一個工廠方法:

public JButton createButton(String name) { 
    (JButton)button = ctx.getBean(JButton.class); 
    button.setName(name); 
    return name; 
} 

這樣就可以避免「新」的關鍵字,讓春天的一切爲你創造。

作爲一個額外的暗示,你就不必執行了ApplicationContextAware,你可以自動裝配的ApplicationContext