2013-02-26 61 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