Spring Boot - как получить класс с аннотацией @Service по имени - PullRequest
0 голосов
/ 14 сентября 2018

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

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

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

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

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

this.context.getBean(method.getDeclaringClass().getSimpleName());
0 голосов
/ 14 сентября 2018

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

@Autowried
AplicationContext ctx;

...

Object bean = ctx.getBean(method.getDeclaringClass());
...