2013-02-26 118 views
1

我正在將非Spring代碼轉換爲Spring(v3.2)代碼。我已經閱讀了Spring文檔,但是我在遇到以下情況時遇到了困難。將代碼轉換爲Spring註釋

類Foo和Buz由Spring管理,並且是單身人士。 Class Bar和MyHyperlinkListener需要由Spring進行管理,並且應該是原型(儘管我不確定如何正確註釋這些)。

  • Bar內部的Buz實例當前爲null,因爲Bar沒有被Spring管理。這些類如何正確註釋以允許這樣做?是否需要創建工廠類的Bar,以及它會是什麼樣子?

  • Bar的構造函數正在從Foo類中傳遞'this'(又名JFrame)。我不確定如何修改代碼以在Spring中處理「this」。我猜這是另一個接受JFrame的Factory,但我不確定如何編碼。


    @Named 
    public class Foo extends JFrame{ 
     private Bar bar; 

     private void doSomeWork(int x){ 
      bar = new Bar(new MyHyperlinkListener(this), x); 
     } 
    } 

    public class Bar extends JPanel{ 
     @Inject 
     private Buz buz; 

     public Bar(MyHyperlinkListener mhl, int x){ 
     } 
    } 

    public class MyHyperlinkListener implements HyperlinkListener{ 
     private JFrame frame; 
     public MyHyperlinkListener(JFrame frame){ 
     this.frame=frame; 
     } 
     //...code omitted 
    } 

    @Named 
    public class Buz{ 
    } 

    @Configuration 
    public class MyConfiguration{ 

    } 

    public class RunMe{ 
     public static void main(String[] args){ 
      AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); 
      context.scan("myPackage"); 
      context.refresh(); 
      context.registerShutdownHook(); 
      Foo foo = context.getBean(Foo.class); 
      foo.setVisible(true); 
     } 
    } 



回答

1

你可以使Bar@Configurable,這將允許它由Spring每當創建一個實例來管理。

@Configurable 
public class Bar extends JPanel{ 
    @Inject 
    private Buz buz; 

    public Bar(MyHyperlinkListener mhl, int x){ 
    } 
} 

或者,您可以使用一個bean工廠來創建您的實例Bar。這將產生相同的效果:

@Configuration 
public class BarFactory 
{ 
    @Bean 
    public Bar createBar(MyHyperlinkListener mhl, int x) { 
    return new Bar(mhl, x); 
    } 
} 

這兩種方法都是有效的,並且主要區別在於它們如何公開管理。他們也會允許你想使用的構造函數。

+0

謝謝!當我給出這個嘗試時,我得到了關於沒有匹配[MyHyperlinkListener]類型的bean的新錯誤。我使用Configurable註解了MyHyperlinkListener類,使用Inject註解了構造函數,但是我仍然得到了相同的消息。然後我在MyConfiguration類中創建了一個createHyperlinkListener Bean,並調用它來代替從Foo內部直接調用新的MyHyperlinkListener。 – user973479 2013-02-26 14:07:49

+0

這給了我一個關於沒有定義[javax.swing.JFrame]類型的唯一bean的新消息。 MyHyperLinkListener在來自不同JFrames的代碼中被調用,所以我不能只綁定一個。有什麼建議麼?自從你的建議以來,我甚至在正確的軌道上完成了自己的工作? – user973479 2013-02-26 14:08:34

+0

注意 - 可配置對我無效,因爲我還需要AspectJ,所以我使用的是配置方式。我仍然可以通過 – user973479 2013-02-26 14:16:09