Есть ли способ встраивать зависимости в созданные вручную объекты?Джерси Инъекция HK2 в создаваемых вручную объектах
public class MyCommand {
@Inject Repository repository;
}
public Repository {
@Inject EntityManager em;
}
MyCommand command = new MyCommand();
хранилище должным образом зарегистрирован Джерси ResourceConfig и может быть введено в объектах, которые создаются через контейнер CDI, например, класс ресурсов.
Но так как я сам создаю команду, аннотация @Inject игнорируется.
Есть ли способ получить зарегистрированный класс рядом с @Inject и @Context? Что-то вроде Application.get (Repository.class)
public class MyCommand {
Repository repository;
public MyCommand() {
repository = Application.get(Repository.class);
}
}
----- EDIT -----
Благодаря вашей помощи и некоторое переосмысление я нашел решение моей проблемы.
Первое, что можно внедрить ServiceLocator без каких-либо операций в объекты.
Во-вторых, я перешел из обычных команд с помощью метода execute в систему командной шины. Причина этого заключается в том, что у меня нет никакого контроля над созданием команд, поэтому есть чистый способ получить введенные зависимости.
Новый подход выглядит следующим образом:
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). Альтернативный вариант введения и связывания с трикотажем описан в моем ответе здесь: http://stackoverflow.com/questions/38976724/how-to-set-an-object-to-context-so-that-i-can-get-it- где-нибудь-в-приложении/39000866 # 39000866 – pandaadb
Я бы утвердил, что hk2 - это универсальная инжекционная рама ;-) – jwells131313
@ jwells131313 вы абсолютно правы :) – pandaadb