java - 将多个数据库(而不是一个)添加到现有应用程序

标签 java database dependency-injection

我们使用 Mongo Db 作为数据库。

如果我们获得以下 JAX-RS 服务(或其他一些无状态/有状态 EJB)。

@Path("my_service_path")
@Stateless
public class GetSomeObject{

  @Inject
  public DB database;

  @GET
  @Consumes("application/json")
  @Produces("application/json")
  public SomeDomainObject get(@QueryParam("some_param") String param){
  ...
  database.find(...);
  ...
  return something;
  }
}

问题:我们需要使用两个或更多数据库,但在我们当前的源代码中这似乎是不可能的。我们目前正在使用注入(inject)的数据库,但如果我们使用 EntityManager 实现或其他东西,我们会遇到同样的问题。是否有一些集成解决方案可以根据用户/应用程序注入(inject)类的不同实例。我们可以尝试

  @Inject
  public Map<String, DB> databases;

但是我们必须添加太多的条件逻辑来处理这些数据库映射。

最佳答案

在 DI 框架中执行此操作的典型方法是通过限定符。如果您使用 CDI,那么您可以通过生产者和限定符注释的组合来完成此操作。我发现这是一种选择编译时已知的几个实例的好方法。如果您需要根据运行时信息检索实例,那么您可能需要使用工厂。

对于 CDI,这里是一些伪代码:

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface PrimaryDatabase {
}

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface SecondaryDatabase {
}

public class DatabaseProducer {

   @Produces
   @PrimaryDatabase
   public DB getPrimaryDB() {
      // ...
   }

   @Produces
   @SecondaryDatabase
   public DB getSecondayDB() {
      // ...
   }
}

public class GetSomeObject{

  @Inject
  @PrimaryDatabase
  public DB primaryDB;

  @Inject
  @SecondaryDatabase
  public DB secondaryDB;
}

关于java - 将多个数据库(而不是一个)添加到现有应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9484466/

相关文章:

java - 检查以逗号分隔的字符串是否至少包含 1 个有效整数的最快方法?

android - 从android数据库中删除一行

javascript - 在 AngularJS 的类方法中无法访问注入(inject)的依赖项

dependency-injection - 无法使用 Autofac 将依赖项注入(inject) Signalr Hub

java - Android 中的离线数据库

java - 单击按钮时如何在 Java 中定义选项卡的操作

java - openjpa 登录 websphere liberty osgi

mysql - 为什么我的 Slave 没有在 MYSQL 上启动?

java - Android SQLite尝试解锁读锁,当前线程未锁定

javascript - Angular 2 - 服务 - 来自另一个服务的依赖注入(inject)