gpt4 book ai didi

java - 使用静态构造函数进行 Spring 依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-01 23:35:40 24 4
gpt4 key购买 nike

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

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

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

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

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);
}

最佳答案

在 Spring 中,情况基本相同。

您的示例可以使用 @Configuration 重写如下:

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

此示例使用环境 - 您可以将配置中的属性添加到其中,也可以直接使用您的配置。

使用 XML 配置会更复杂,但您可以将 @Configuration 与 XML 混合。

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

@Autowired
public LogsModule(@Qualifier("searchExecutor") ExecutorService e) { ... }

关于java - 使用静态构造函数进行 Spring 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18725312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com