Я новичок в Spring (переход с 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.

ИЗМЕНИТЬ Спасибо за быстрые ответы,

Я попробовал использовать

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);
0
Mateusz Wu 14 Сен 2018 в 13:30

2 ответа

Лучший ответ

Используйте java.lang.reflect.Method.getDeclaringClass(), чтобы узнать, в каком классе объявлен данный метод. method.getClass() вернет тип объекта method, которым является java.lang.reflect.Method.

@Autowired
AplicationContext ctx;

...

Object bean = ctx.getBean(method.getDeclaringClass());
1
beta 28 Ноя 2019 в 07:40

В Spring имя по умолчанию - простое имя.

Плюс, как и в ответе Карола, вы должны использовать getDeclaringClass (), чтобы получить класс класса с помощью метода.

Так что ты должен позвонить

this.context.getBean(method.getDeclaringClass().getSimpleName());
1
Simon Martinelli 14 Сен 2018 в 10:39