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