使用静态构造函数的Spring依赖注入

时间:2013-09-10 17:27:22

标签: java spring dependency-injection

我已经使用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);
}

1 个答案:

答案 0 :(得分: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) { ... }