【发布时间】:2016-09-20 12:30:14
【问题描述】:
有没有办法将依赖项注入到手动创建的对象中?
public class MyCommand {
@Inject Repository repository;
}
public Repository {
@Inject EntityManager em;
}
MyCommand command = new MyCommand();
Repository 已在 jersey ResourceConfig 中正确注册,并且可以注入通过 CDI 容器创建的对象中,例如资源类。
但由于我自己创建了命令,@Inject 注释被忽略了。
有没有办法在@Inject 和@Context 之外获取注册类? 类似 Application.get(Repository.class)
public class MyCommand {
Repository repository;
public MyCommand() {
repository = Application.get(Repository.class);
}
}
-- 编辑 -----
感谢您的帮助和重新思考,我找到了解决问题的方法。
第一件事是可以在没有任何准备的情况下将 ServiceLocator 注入到您的对象中。
第二件事是我从带有执行方法的普通命令转移到了命令总线系统。 原因是我无法控制命令的创建,所以有干净的方法来注入依赖项。
新方法如下所示:
class CommandBus {
private final ServiceLocator serviceLocator;
@Inject
public CommandBus(ServiceLocator serviceLocator) {
this.serviceLocator = serviceLocator;
}
public void dispatch(Command command) {
Class handlerClass = findHandlerClassForCommand(command);
CommandHandler handler = (CommandHandler) serviceLocator.getService(handlerClass);
handler.handle(command);
}
}
interface CommandHandler {
void handle(Command command);
}
interface Command {
}
class ConcreteCommand implements Command {
// I'm just a dto with getters and setters
}
class ConcreteHandler implements CommandHandler {
private final SomeDependency dependency;
@Inject
public ConcreteHandler(SomeDependency dependency) {
this.dependency = dependency;
}
@Override
public void handle(ConcreteCommand command) {
// do some things
}
}
在我的资源中,我有这样的东西:
@Path("/some-resource")
class Resource {
@Context
private CommandBus bus;
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void runCommand(ConcreteCommand command) {
bus.dispatch(command);
}
}
【问题讨论】:
-
这是可能的,但是我建议使用通向通用注入框架的桥接器(例如 google guice)。或者,我在此处的回答中描述了球衣注射和绑定:stackoverflow.com/questions/38976724/…
-
我会声称 hk2 是一个通用注入框架 ;-)
-
@jwells131313 你是对的 :)
标签: java dependency-injection jersey hk2