我有一个类(loginForm
),它将使用CustomConnectionProvider
由第三方库(hibernate)实例化。我需要注入一个guice管理的依赖项class.forName().newInstance()
,它将为多租户提供数据源。
我无法直接MyDatabaseFactory
MyDatabaseFactory,因为@Inject
不是托管bean。我无法控制它是如何被创造出来的。
我刚开始使用Guice作为Play应用程序的一部分。任何示例或想法将不胜感激,我正在寻找像CustomConnectionProvider
。
针对特定情况修复
幸运的是,ServiceLocator
提供了一种静态方法来获取Play.application()
,并且我使用它来获取我的工厂实例。我仍然想知道我是否必须在没有游戏的情况下修复它。
Play 2.5的更新
2.5中不推荐使用injector
。我们需要像罗伯特建议的那样使用静态注射。
答案 0 :(得分:2)
您可以使用静态注射。见https://github.com/google/guice/wiki/Injections
通过获取对注入类型的访问而不自己注入,对象可以部分地参与依赖注入。使用
{
"Name": "Derek",
"Gender": "Male"
}
在模块中指定要在注入器创建时注入的类:
requestStaticInjection()
Guice将注入具有@Inject批注的类的静态成员。
答案 1 :(得分:1)
实际上,requestStaticInjection
不是推荐的方法。正如this link解释(This API is not recommended for general use because it suffers many of the same problems as static factories: it's clumsy to test, it makes dependencies opaque, and it relies on global state.
),它在很少的情况下会产生许多问题。行为不一致,注射一直没有成功。
我不得不采取稍微不同的方法:我的情况有点复杂,我的类的实例将由Hibernate使用Class.forName()
创建,这可能是静态注入可能失败。
我必须创建一个Singleton工厂,它将在模块创建开始时初始化并绑定到Guice Injector,这个工厂将保存我需要注入实际类的实际bean。它提供了一个静态方法来获取所需的bean。
public Class RequiredBeanFactory {
private static RequiredBean bean;
//note this is a package private
RequiredBeanFactory(RequiredBean bean) {
this.bean = bean;
}
public static RequiredBean getBean() {
return bean;
}
}
在我的模块中,我正在初始化它并绑定。
public class MyModule extends AbstractModule {
private final RequiredBean bean;
@Inject
public MyModule(RequiredBean bean) {
this.bean = bean;
}
protected void configure() {
RequiredBeanFactory factory = new RequiredBeanFactory(this.bean);
bind(RequireBeanFactory.class).toInstance(factory);
}
}
在我的HibernateCustom类中,我只使用RequiredBeanFactory.getBean()
。
这是一种黑客行为,可能与Guice提到的副作用相同,但它在我的掌控之中并且行为是一致的。