我在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中注册的实例。
任何建议。 提前谢谢......
答案 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);
}
}
希望这在某种程度上有所帮助。也许有人愿意为你的案子写一些关于提供者的东西。