1

Spring以外のコードをSpring(v3.2)コードに変換中です。Springのドキュメントを読みましたが、以下に示す次の状況に頭を悩ませることができません。

クラスFooとBuzはSpringによって管理され、シングルトンです。クラスバーとMyHyperlinkListenerはSpringによって管理される必要があり、プロトタイプである必要があります(ただし、これらに正しく注釈を付ける方法はわかりません)。

  • BarはSpringによって管理されていないため、Bar内のBuzのインスタンスは現在nullです。これを可能にするために、これらのクラスにどのように正しく注釈を付けるのでしょうか?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 に答える