Guice坚持拥有多个持久性单元

时间:2019-01-30 02:10:31

标签: guice-persist

我有带有多个持久性单元的设置向导,但是我遇到的问题是,我希望有一个默认值,而不是必须显式声明一个或另一个。当我想要“另一个”时,我会明确要求它。当我想要默认的设备时,我会想做的事情就像我只有一个PU。

我尝试仅在PrivateModule中安装JpaPersistModule,但这并没有改变任何东西。如果我绑定到“默认”注释并尝试在没有“ annotatedWith”分类器的情况下进行重新绑定,则会收到重新绑定错误。

这可能吗?我相信,与CDI相当,我可以注入注入点进行查看,并当场做出决定。我还没有找到与之等效的东西,但是一定有。

就代码而言,这就是我所拥有的(但不想要):

@Inject
public SomethingService(@Primary Repository repository)

@Inject
public SomethingElseService(@Secondary Repository repository)

相反,我想要这个:

@Inject
public SomethingService(Repository repository)

@Inject
public SomethingElseService(@Secondary Repository repository)

1 个答案:

答案 0 :(得分:0)

这与我尝试使用@Named注释而不是How to bind a dynamic @Named binding

中的@Primary / @Secondary注释非常相似。

我已经将它与ProviderPrivateModule s一起使用;遵循未经测试的以下代码的某些事情(我认为)将反映我已经开始使用的设置,尽管在您的情况下可能不需要全部设置(并且杰夫对我的问题的回答可能会提供更多的上下文) :

public class PrimaryRepositoryModule extends AbstractModule {
    @Provides
    public Repository provideRepository() {
         return new PrimaryRepository()
    }
}

public class SecondaryRepositoryModule extends AbstractModule {
    public void configure() {
        install(new PrivateSecondaryRepositoryModule())
    }
    private static class SecondaryProvider implements Provider<Repository> {
        public Repository get() {
            return new SecondaryRepository()
        }
    }
    private static class PrivateSecondaryModule extends PrivateModule {
        public void configure() {
            bind(Repository.class).annotatedWith(Secondary.class)
                .toProvider(SecondaryProvider.class)
            expose(Repository.class).annotatedWith(Secondary.class)
    }
}