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

标签 java spring dependency-injection

我已经使用 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/

相关文章:

java - Autowiring 验证,无需在 Spring 中以模型命名 Controller

java - 使用Spring + Hibernate/EntityManager遇到的BeanCreationException

java - Maven 无法找到 org.springframework.ws :spring-ws:1. 5.8

design-patterns - 使用依赖注入(inject)有哪些缺点?

java - Java,我无法在控制台上打印整个响应

java - jar 文件中的源可见

java - JNDI 查找是否保持连接打开 - 这就是我的负载平衡被破坏的原因吗?

java - Selenium 中不允许使用复合类名

java - 在java中的单元测试的服务类中注入(inject)不断增长的依赖关系的最佳方法是什么

c# - 当您还需要 "default"具体依赖项时,哪种依赖项注入(inject)更好的模式?