1

我正在将非 Spring 代码转换为 Spring (v3.2) 代码。我已经阅读了 Spring 文档,但我无法理解下面显示的以下情况。

类 Foo 和 Buz 由 Spring 管理并且是单例。类 Bar 和 MyHyperlinkListener 需要由 Spring 管理并且应该是原型(尽管我不确定如何正确注释这些)。

  • Bar 内部的 Buz 实例当前为空,因为 Bar 不是由 Spring 管理的。如何正确注释这些类以允许这样做?是否需要为 Bar 创建一个 Factory 类,这会是什么样子?

  • Bar 的构造函数从 Foo 类内部传递了一个“this”(又名 JFrame)。我不确定如何修改代码以在 Spring 中处理“this”。我猜这是另一个接受 JFrame 的工厂,但我不确定如何编写代码。


    @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);
        }
    }



4

1 回答 1

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);
  }
}

这两种方法都是有效的,主要区别在于它们如何公开管理。它们还将允许您希望使用的构造函数。

于 2013-02-26T13:42:57.717 回答