2

Jersey アプリケーションで HK2 コンテナーを使用しています。カスタム ファクトリ メソッドを使用して、HK2 コンテナーから注入されたインスタンスを取得する必要があります。例えば ​​、

// Here I declare the IOC binding.
public class ApplicationBinder extends AbstractBinder {
    @Override
    protected void configure() {
        bind(Logger.class).to(ILogger.class).in(Singleton.class);;       
        bind(MySqlRepository.class).to(IRepository.class).in(Singleton.class);
    }
}



 public class MyApplication extends ResourceConfig {
    public static ApplicationBinder binder ;
    public MyApplication () {
        binder = new ApplicationBinder();
        register(binder);
        packages(true, "com.myapplication.server");
    }
    }

これが私のコードです:

public class BusinessLogic

    {
        //@Inject
        //ILogger logger ; 

        //Instead 
        ILogger logger = DependencyResolver .resolve(ILogger.class) // resolve will get ILogger from HK2   container
    }

このようにする必要がある理由は、時々、依存関係を持つクラスを手動で割り当てるためです。このように、@Inject を使用するたびに null が返されます。たとえば、 new BusinessLogic() を使用すると、@Inject のロガーは null になります。ILogge を取得するには、ビジネスロジックもバインドし、IOC を使用する必要があります。

私はこのようなものが必要です:

public class DependencyResolver {    

    public static <T> T resolve(Class<T> beanClass){           
        return instance;
    }    
}

MyApplication に登録したインスタンスを取得するには、DependencyResolver を使用する必要があります。

助言がありますか。前もって感謝します...

4

1 に答える 1

4

私はあなたが何をしたいのか100%確信が持てませんが...

AbstractBinder.bind(...)バインディング自体を誤解していると思います。また、管理されたコンポーネントではないインスタンスに何かを注入することはできません(あなたのようなBusinessLogic)。

に関する例については、jersey.java.net -iocを参照してくださいBusinessLogicComponentProviderおよび/またはを見ているかもしれませんInjectableProvider

ILogger の場合、次のように Factory を作成してバインドすることをお勧めします。

public class LoggerFactory implements Factory<ILogger> {

    // inject stuff here if you need (just an useless example)
    @Inject
    public LoggerFactory(final UriInfo uriInfo) {
        this.uriInfo = uriInfo;
    }

    @Override
    public ILogger provide() {
        // here you resolve you ilogger
        return MyLocator.resolve(ILogger.class);
    }

    @Override
    public void dispose(ILogger instance) {
        // ignore
    }

}

バインドファクトリー

public class ApplicationBinder extends AbstractBinder {
    @Override
    protected void configure() {
        bindFactory(LoggerFactory.class).to(ILogger.class).in(PerLookup.class /* or other scopeAnnotation if needed */);

        // what's you Logger.class ? 
        // bind(Logger.class).to(ILogger.class).in(Singleton.class);      
        // bind(MySqlRepository.class).to(IRepository.class).in(Singleton.class);
    }
}

これが何らかの形で役に立ったことを願っています。誰かがあなたのケースのプロバイダーについて何か書いてくれるかもしれません。

于 2014-09-21T20:02:56.783 に答える