0

我已经使用 Guice 几年了,刚刚切换到使用 Spring 的公司。我是依赖注入的粉丝,但在弄清楚如何让 Spring 做我想做的事情时遇到了一些问题。

这是我现在在代码中的内容(它不是 scala 代码,只是更短,所以使用该语法):

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

在番石榴中,我可以使用命名注释来拥有不同的执行器,或者只为需要它的任何人使用一个执行器并定义

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

我不确定如何在 Spring 中进行设置。似乎我看到的每个示例都没有真正涵盖泛型,也没有真正涵盖静态构造函数或能够“提供”值。

从 Guice 获得与上述结果相似的结果的最佳方法是什么?是否有像 guice 和 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 配置会更复杂,但您可以@Configuration与 XML 混合使用。

如果您需要多个执行器,您可以使用@Qualifier(或者也许@Named)通过 bean 名称来区分候选者:

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