[英]Inject guice managed dependency in a non guice class
我有一個類( CustomConnectionProvider
),它將使用class.forName().newInstance()
由第三方庫(hibernate)實例化。 我需要注入一個guice托管依賴項,例如MyDatabaseFactory
,它將為多租戶提供數據源。
我無法直接@Inject
MyDatabaseFactory,因為CustomConnectionProvider
不是托管bean。 我無法控制它是如何被創造出來的。
我剛開始使用Guice作為Play應用程序的一部分。 任何示例或想法將不勝感激,我正在尋找像ServiceLocator
這樣的解決方案。
針對特定情況修復幸運的是, Play.application()
提供了一個靜態方法來獲取injector
,我正在使用它來獲取我的工廠實例。 我仍然想知道我是否必須在沒有游戲的情況下修復它。
Play 2.5的更新 Play.application()
在2.5中已棄用。 我們需要像羅伯特建議的那樣使用靜態注射。
您可以使用靜態注入。 請參閱https://github.com/google/guice/wiki/Injections
通過獲取對注入類型的訪問而不自己注入,它使對象可以部分地參與依賴注入。 使用
requestStaticInjection()
在模塊中指定要在注入器創建時注入的類:
@Override public void configure() {
requestStaticInjection(ProcessorFactory.class); ... }
Guice將注入具有@Inject注釋的類的靜態成員。
實際上, requestStaticInjection
不是推薦的方式。 正如這個鏈接所解釋的那樣( 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提到的副作用相同,但它在我的控制下並且行為是一致的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.