gpt4 book ai didi

java - 是否可以使用 Java 配置在 Spring Framework 中编写类似 Guice 的模块?

转载 作者:搜寻专家 更新时间:2023-11-01 03:02:27 24 4
gpt4 key购买 nike

我想知道是否有某种折衷方案允许您模拟/利用 Google Guice 风格的 EDSL 编写模块的方式,该模块将接口(interface)绑定(bind)到 Spring 中的实现。

例如,假设我有一个如下所示的 Google Guice 模块:

public class BillingModule extends AbstractModule {
protected void configure() {
bind(BillingService.class).to(RealBillingService.class);
}
}

这将 BillingService 接口(interface)绑定(bind)到 RealBillingService 实现。

我认为我可以利用 Spring 的 Java 配置类来实现的一种方式如下所示

@Configuration
public class BillingConfiguration {
@Bean
public BillingService getRealBillingService() {
return new RealBillingService();
}
}

我想知道是否有更好的方法来做到这一点,或者这种方法是否会随着使用越来越复杂而崩溃。

我真的很喜欢 Google Guice 以及它如何进行依赖注入(inject),但仅此而已。 Spring 做的更多(是的,它的依赖注入(inject)机制仍然不如 Guice“好”)但不可否认的是有一些我们想利用的伟大项目,如 Spring Data、Spring Data REST 等,它们消除了对编写大量样板代码。

最佳答案

这样做的方法是使用@Profile 来包含同一接口(interface)的不同实现。

一个简单的例子是DataSource。然而,这可以很容易地扩展到具有多个实现的任何其他接口(interface)。

举个例子:

@Configuration
public class LocalDataConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:com/bank/config/sql/schema.sql")
.addScript("classpath:com/bank/config/sql/test-data.sql")
.build();
}
}

然后用于生产:

@Configuration
@Profile("production")
public class JndiDataConfig {

@Bean
public DataSource dataSource() throws Exception {
Context ctx = new InitialContext();
return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
}

}

然后您需要做的就是在启动应用程序上下文和@Inject/@Autowire DataSource 时声明哪些配置文件处于 Activity 状态在您需要的地方。

关于java - 是否可以使用 Java 配置在 Spring Framework 中编写类似 Guice 的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32448175/

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