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 的记录器为空。我还必须绑定业务逻辑并使用 IOC 才能获得 ILogge。

我需要这样的东西:

public class DependencyResolver {    

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

我需要使用 DependencyResolver 来获取我在 MyApplication 中注册的实例。

有什么建议么。提前致谢...

4

1 回答 1

4

我不是 100% 确定你到底想做什么,但是......

我认为你误解AbstractBinder.bind(...)或绑定本身。此外,您不能将某些东西注入不是托管组件的实例(例如您的BusinessLogic)。

有关BusinessLogic. 你可以看看ComponentProvider和/或InjectableProvider

对于您的 ILogger,我建议像这样创建和绑定工厂:

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);
    }
}

希望这在某种程度上有所帮助。也许有人愿意为您的案例写一些关于 Providers 的东西。

于 2014-09-21T20:02:56.783 回答