0

私は数年前から Guice を使用しており、Spring を使用する会社に切り替えたばかりです。私は Dependency Injection のファンですが、Spring に自分のやりたいことをさせる方法を理解するのにいくつか問題があります。

これが私が現在コードに持っているものです(スカラコードではなく、その構文を使用して短いだけです):

class A(b: B)
class B(exe: ExecutorService)
...
@Value("${search.threads}") var searchThreads: int
exe = Executors.newFixedThreadPool(searchThreads)

グアバでは、名前付き注釈を使用してさまざまなエグゼキューターを使用するか、それを必要とする人のために1つのエグゼキューターを使用して定義するだけです

final int searchThreads = readSearchThreadsFromConfigs()
bind(Executor.class).toInstance(Executors.newFixedThreadPool(searchThreads));

Spring 内でこれを設定する方法がわかりません。私が見るすべての例は、ジェネリックを実際にカバーしていないようであり、静的コンストラクターや値を「提供」できることも実際にはカバーしていないようです。

上記の Guice と同様の結果を得る最良の方法は何ですか? Guice and dagger の使用のような「モジュール」の概念はありますか (xml ファイル以外、静的にチェックされるもの)?

編集: 現在使用されているコードの一部を次に示します。コンストラクター内にエグゼキューターを作成します。

@Autowired
public LogsModule(@Value("${search.threads}") final int searchThreads) {
  searchPool = Executors.newFixedThreadPool(searchThreads);
}
4

1 に答える 1

3

春も基本的には同じです。

を使用して、例を次のように書き直すことができます@Configuration

@Bean(value = "searchExecutor", destroyMethod = "shutdownNow")
public ExecutorService executorService(Environment env) {
    final int searchThreads = env.getProperty("searchThreads", Integer.class, 3);
    return Executors.newFixedThreadPool(searchThreads));
}

この例ではEnvironment、構成からプロパティを追加するか、代わりに構成を直接使用することができます。

XML 構成ではより複雑になりますが、XML と組み合わせることができ@Configurationます。

複数のエグゼキューターが必要な場合は、@Qualifier(またはおそらく@Named) を使用して、候補を Bean 名で区別できます。

@Autowired
public LogsModule(@Qualifier("searchExecutor") ExecutorService e) { ... }
于 2013-09-10T18:04:05.970 に答える