Я совсем новичок в весне (переход с PHP на Java).
В моем коде у меня есть java.lang.reflect.Method
объекты, и мне нужно создать экземпляр этого класса со всеми его зависимостями.
Обычно я использую аннотацию @Autowired
в своем коде, но это невозможно, потому что мой код получает разные объекты Method, а не конкретные классы.
Вопрос - как получить экземпляр класса из контейнера зависимостей, не используя аннотации и имея только имя класса?
В php я использовал библиотеки, которые давали мне доступ к контейнеру, и я мог просто получать DI-сервисы по его имени класса, как:
$this->container->get('My\Class\Name');
Весной я попробовал:
@Autowired
private ApplicationContext context;
void myMethod(Method method){
this.context.getBean(method.getClass());
и
this.context.getBean(method.getClass().getName());
и это привело к NullPointerException
.
EDIT
Спасибо за быстрые ответы,
Я пытался использовать
context.getBean(method.getDeclaringClass());
и
context.getBean(method.getDeclaringClass().getSimpleName());
И это также привело к NullPointerException.
На самом деле это нормально для моих потребностей, чтобы получить этот класс по классу или по имени. Я пытаюсь написать свою собственную командную шину для CQRS.
Позвольте мне показать вам код:
Обработчик:
public class SimpleCommandBus implements CommandBus {
@Autowired
private ApplicationContext context;
private Map<Class, Method> registry = new HashMap<>();
@Override
public void register(Class c, Method o) {
registry.put(c, o);
}
@Override
public void dispatch(Object command) {
if (!registry.containsKey(command.getClass())) {
throw new CommandDispatchException(String.format("Handler for command %s was not defined.", command));
}
Method method = registry.get(command.getClass());
Object handler = context.getBean(method.getDeclaringClass().getSimpleName());//line causing exception
Класс обслуживания:
@Service
public class TestHandler {
public void handle(TestCommand command){
System.err.println(command.getId());
}
}
Вызов командного автобуса:
Method method = TestHandler.class.getMethod("handle", TestCommand.class);
TestCommand command = new TestCommand("Test command");
commandBus.register(TestCommand.class, method);
commandBus.dispatch(command);