使用 Guice 注入 EntityManager
Injecting EntityManager with Guice
在我的 post 中收到关于 Guice 注入的非常好的答案后,我想知道,您是否也可以帮助我在 Guice 中注入 EntityManagers。
我已经阅读了有关 Guice JPA 的文章 https://github.com/google/guice/wiki/JPA。我的代码如下所示(我的工作需要供应商):
提供商:
public class DatabaseControllerProvider implements Provider<DatabaseControllerInterface> {
private final Provider<EntityManager> entityManagerProvider;
@Inject
public DatabaseControllerProvider(final Provider<EntityManager> manager) {
this.entityManagerProvider = manager;
}
@Override
public DatabaseControllerInterface get() {
return new DatabaseControllerImpl(entityManagerProvider.get());
}
}
DatabaseControllerImplementation 的构造函数:
public class DatabaseControllerImpl implements DatabaseControllerInterface {
private final EntityManager em;
@Inject
public DatabaseControllerImpl(final EntityManager manager) {
this.em = manager;
}
}
顶级我称之为:
public LogInFront() {
final Injector injector = Guice.createInjector(new ModuleBinder(), new JpaPersistModule("ATVPersistence"));
final PersistService persistService = persistenceInjector.getInstance(PersistService.class);
persistService.start();
logInService = injector.getInstance(LogInServiceInterface.class);
}
用我的数据库实例化 JPAPersistService。
我收到一个错误 no Implementation for EntityManager was bound
,但是如果我调用
...
public LogInFront() {
final Injector injector = Guice.createInjector(new JpaPersistModule("ATVPersistence"));
final PersistService persistService = persistenceInjector.getInstance(PersistService.class);
persistService.start();
logInService = injector.getInstance(LogInServiceInterface.class);
}
实例化工作正常,数据库工作正常,一切都很好很简单。
所以我的猜测是,我的 GuiceModule 有问题。如上所示,当我不调用 new ModuleBinder()
时,一切正常。
public class ModuleBinder extends AbstractModule {
@Override
protected void configure() {
bind(DatabaseControllerInterface.class).asEagerSingleton();
bind(AnalyzerInterface.class).asEagerSingleton();
bind(SystemAdministrationInterface.class).asEagerSingleton();
bind(LogInServiceInterface.class).asEagerSingleton();
}
}
----------------------------编辑---------------- ----------------------
重写了上面的部分。
Tl;博士版本:
ModuleBinder 搞砸了 EntityManager 的注入 - 为什么?
------------------------发现错误---------------- --------------
我觉得有点傻,我发现了错误。当查看 ModuleBinder
时,您可以看到,它将所有内容绑定为 EagerSingleton
,但显然,EntityManager
尚不存在(PersistService 在创建 Injector 后启动)。我在这里创建了一个新的 post:
希望对其他人有帮助!
此致,
约瑟夫背囊
我觉得有点傻,我发现了错误。当查看 ModuleBinder
时,您可以看到,它将所有内容绑定为 EagerSingleton
,但显然,EntityManager
尚不存在(PersistService 在创建 Injector 后启动)。
通话中
final Injector injector = persistenceInjector.createChildInjector(new ModuleBinder());
修复所有问题。它创建了一个 childInjector,它知道父级知道的一切,因此 PersistenceService 已经启动,您可以将 EntityManager
注入所有内容。
在我的 post 中收到关于 Guice 注入的非常好的答案后,我想知道,您是否也可以帮助我在 Guice 中注入 EntityManagers。
我已经阅读了有关 Guice JPA 的文章 https://github.com/google/guice/wiki/JPA。我的代码如下所示(我的工作需要供应商):
提供商:
public class DatabaseControllerProvider implements Provider<DatabaseControllerInterface> {
private final Provider<EntityManager> entityManagerProvider;
@Inject
public DatabaseControllerProvider(final Provider<EntityManager> manager) {
this.entityManagerProvider = manager;
}
@Override
public DatabaseControllerInterface get() {
return new DatabaseControllerImpl(entityManagerProvider.get());
}
}
DatabaseControllerImplementation 的构造函数:
public class DatabaseControllerImpl implements DatabaseControllerInterface {
private final EntityManager em;
@Inject
public DatabaseControllerImpl(final EntityManager manager) {
this.em = manager;
}
}
顶级我称之为:
public LogInFront() {
final Injector injector = Guice.createInjector(new ModuleBinder(), new JpaPersistModule("ATVPersistence"));
final PersistService persistService = persistenceInjector.getInstance(PersistService.class);
persistService.start();
logInService = injector.getInstance(LogInServiceInterface.class);
}
用我的数据库实例化 JPAPersistService。
我收到一个错误 no Implementation for EntityManager was bound
,但是如果我调用
...
public LogInFront() {
final Injector injector = Guice.createInjector(new JpaPersistModule("ATVPersistence"));
final PersistService persistService = persistenceInjector.getInstance(PersistService.class);
persistService.start();
logInService = injector.getInstance(LogInServiceInterface.class);
}
实例化工作正常,数据库工作正常,一切都很好很简单。
所以我的猜测是,我的 GuiceModule 有问题。如上所示,当我不调用 new ModuleBinder()
时,一切正常。
public class ModuleBinder extends AbstractModule {
@Override
protected void configure() {
bind(DatabaseControllerInterface.class).asEagerSingleton();
bind(AnalyzerInterface.class).asEagerSingleton();
bind(SystemAdministrationInterface.class).asEagerSingleton();
bind(LogInServiceInterface.class).asEagerSingleton();
}
}
----------------------------编辑---------------- ----------------------
重写了上面的部分。
Tl;博士版本: ModuleBinder 搞砸了 EntityManager 的注入 - 为什么?
------------------------发现错误---------------- --------------
我觉得有点傻,我发现了错误。当查看 ModuleBinder
时,您可以看到,它将所有内容绑定为 EagerSingleton
,但显然,EntityManager
尚不存在(PersistService 在创建 Injector 后启动)。我在这里创建了一个新的 post:
希望对其他人有帮助!
此致,
约瑟夫背囊
我觉得有点傻,我发现了错误。当查看 ModuleBinder
时,您可以看到,它将所有内容绑定为 EagerSingleton
,但显然,EntityManager
尚不存在(PersistService 在创建 Injector 后启动)。
通话中
final Injector injector = persistenceInjector.createChildInjector(new ModuleBinder());
修复所有问题。它创建了一个 childInjector,它知道父级知道的一切,因此 PersistenceService 已经启动,您可以将 EntityManager
注入所有内容。