10

私たちは、将来のモジュール化の取り組みのために JSR-330 アノテーションを使用した依存性注入を使用することを決定し、Guice 2 SVN に基づく最初の成果物に非常に満足しています。

ここで、必要な構造がプログラムで構成されたときにSpringでも機能することを単体テストを通じて確認し、文書化する必要があります(Guiceと同じリファクタリングサポートが必要なため、XMLファイルは必要ありません)。私は and に問題が@Providerあります@Inject @Named("foo") Stringが、次のもので簡単に@Inject作業できました:

ApplicationContext ctx = new AnnotationConfigApplicationContext(LIBL_Object.class, 
                                                                CORE_Provider.class);
this.object = ctx.getBean(LIBL_Object.class);

ここで、LIBL_Object は に注入される基本クラスですが、CORE_Provider は Spring 内で期待どおりに登録されません。

CORE_Provider の実装は

package qa.jsr330.core;

import javax.inject.Provider;

public class CORE_Provider implements Provider<ProvidedInterface> {
    @Override
    public ProvidedInterface get() {
        return new CORE_Provided();
    }
}

そして私はそれを注入したい

package qa.jsr330.core;

import javax.inject.Inject;

public class LIBL_Object {

    private ProvidedInterface provided;

    public ProvidedInterface getProvided() {
        return provided;
    }

    @Inject
    public void setProvided(ProvidedInterface provided) {
        this.provided = provided;
    }
// Other stuff omitted.
}

また、@Named タグを使用すると、構成値を非常に明確に渡すことができることもわかりました。このコードは次のようになります。

String hostname;
@Inject
public void setHostname(@Named("as400.hostname") String hostname) {
    this.hostname = hostname;
}

次に、この文字列を Guice に登録します。

bindConstant().annotatedWith(Names.named("as400.hostname")).to(value);

したがって、2つの質問は次のとおりです。

  • @ProviderクラスをプログラムでSpring 3に登録するにはどうすればよいですか?
  • @Named が適切に選択できるように、文字列定数を Spring 3 に登録するにはどうすればよいですか?
4

1 に答える 1

6

簡単に言えば、Spring のプログラムによる構成などはありません。

Spring と Guice の両方が JSR-330 API をサポートし、Spring は現在 XML なしで構成できるという事実にもかかわらず、両者のイデオロギーは依然として大きく異なります。Spring は、XML ファイルまたは注釈付き Java クラスのいずれかの形式で、静的構成に依存しています。したがって、Guice スタイルの構成を Spring に直接適用しようとすると、困難が生じる可能性があります。

の問題点について・SpringはGuiceのバインディングと同じようにProviderサポートしていない(ちなみにこの使い方はJSR-330のドキュメントでは規定されていない)。したがって、Spring 固有のアノテーションが必要になる場合があります。たとえば、javax.inject.ProvidertoProvider()Provider

@Configuration
public class CORE_Provider implements Provider<ProvidedInterface> {
      @Override @Bean
      public ProvidedInterface get() {
          return new CORE_Provided();
      }
} 

Spring 構成の静的な性質により、外部からのバインディング値は難しい場合があります。たとえば、あなたの場合、次のように実行できます。

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(IBL_Object.class);
ctx.register(CORE_Provider.class);
ctx.registerBeanDefinition("as400.hostname",
    BeanDefinitionBuilder.rootBeanDefinition(String.class)
        .addConstructorArgValue(value).getBeanDefinition());
ctx.refresh();
于 2011-01-03T14:32:33.133 に答える