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

Cal*_*Cal 6 java spring dependency-injection guice

我想知道是否有某种妥协可以让您模拟/利用 Google Guice 风格的 EDSL 编写模块的方式,该方式将接口绑定到 Spring 中的实现。

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

public class BillingModule extends AbstractModule {
    protected void configure() {
        bind(BillingService.class).to(RealBillingService.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将BillingService接口绑定到RealBillingService实现。

我认为我可以使用 Spring 的 Java 配置类的一种方法是这样的

@Configuration
public class BillingConfiguration {
  @Bean
  public BillingService getRealBillingService() {
    return new RealBillingService();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ale*_*nes 3

做到这一点的方法是使用@Profile包含同一接口的不同实现。

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

举个例子:

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后用于生产:

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

}
Run Code Online (Sandbox Code Playgroud)

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