使用定制工厂HK2 DI和泽西岛

时间:2014-09-20 20:34:24

标签: java jersey-2.0 hk2

我在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。 例如,如果我使用新的BusinessLogic(),则带有@Inject的记录器为空。我还必须绑定businesslogic并使用IOC来获取ILogge。

我需要这样的东西:

public class DependencyResolver {    

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

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

任何建议。 提前谢谢......

1 个答案:

答案 0 :(得分:2)

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

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

有关BusinessLogic的示例,请参阅jersey.java.net - ioc。您可以查看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
    }

}

Bind Factory

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

希望这在某种程度上有所帮助。也许有人愿意为你的案子写一些关于提供者的东西。