簡體   English   中英

在非guice類中注入guice管理的依賴項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM