Java 在绑定时在被注射者上指定HK2名称

Java 在绑定时在被注射者上指定HK2名称,java,hk2,Java,Hk2,我在所有REST微服务中使用HK2进行依赖注入。创建数据库访问对象(DAO)时,构造函数通常如下所示 @Inject public ServiceDao(final DataSource dataSource) { ... } 应用程序有一个定义所有绑定的初始化块 @Override protected void configure(ServiceConfig config, AbstractBinder binder) { binder.bind(config.dataSou

我在所有REST微服务中使用HK2进行依赖注入。创建数据库访问对象(DAO)时,构造函数通常如下所示

@Inject
public ServiceDao(final DataSource dataSource) {
    ...
}
应用程序有一个定义所有绑定的初始化块

@Override
protected void configure(ServiceConfig config, AbstractBinder binder) {
    binder.bind(config.dataSource).to(DataSource.class);
    binder.bind(ServiceDao.class).to(ServiceDao.class).in(Singleton.class);
}
我有一个服务,出于性能原因,需要直接访问另一个服务的数据库。我知道我可以修改每个DAO,使其具有一个名为的数据源

public ServiceADao(final @Named("ServiceADataSource") DataSource) {
-


但是,是否有任何方法可以指定每个DAO应该使用哪个数据源,而不修改DAO代码本身?(仅使用我在配置块中提供的
AbstractBinder

我可以想到的一件事是对DAO使用
Factory
,并从
ServiceLocator
获取所需的任何数据源,你自己用适当的数据源来构造dao,就像peeskillet一样,我想不出任何特别的方法来实现这一点。除了建议的工厂之外,您还可能实现一个InjectionResolver()。此外,在这种情况下,您可能可以使用非限定注释,这样您就不必到处注释所有内容()。希望有帮助我能想到的一件事是为dao使用
工厂
,从
ServiceLocator
获取您想要的任何数据源,然后自己用适当的数据源构建dao。像peeskillet一样,我想不出任何特殊的方法来实现这一点。除了建议的工厂之外,您还可能实现一个InjectionResolver()。此外,在这种情况下,您可能可以使用非限定注释,这样您就不必到处注释所有内容()。希望有帮助
binder.bind(config.serviceADataSource)
      .named("ServiceADataSource")
      .to(DataSource.class);