Исправьте использование BeanFactory для получения bean-компонента по имени, типу и аргументам конструктора - PullRequest
0 голосов
/ 10 марта 2020

У меня есть несколько прототипов bean-компонентов, которые имеют общий суперкласс (Foo). Все эти bean-компоненты имеют общий конструктор, принимающий один аргумент String.

Я хотел бы программно получить (и создать) эти bean-компоненты на основе полностью определенного имени bean-компонента и аргумента конструктора String. Поскольку это имя бина происходит из (внешней) конфигурации, мне нужно убедиться, что таким образом могут быть созданы только бины общего суперкласса Foo .

Представьте себе следующее:

  • Интерфейс Foo
  • Боб A implements Foo
  • Боб B implements Foo
  • Боб C implements Bar

I теперь нужен метод, который делает это:

public Foo getBean(String name, String arg) {
    // Create a new instance of A or B (but not C) depending on name.
    // Pass args as the constructor argument
}

Мне уже удалось попробовать и исключить следующее:

  • BeanFactory#getBean(String name, Object... args) Too generi c. Позволяет создавать любой bean-компонент, соответствующий типу Foo.
  • BeanFactory#getBean(String name, Class<T> requiredType). Невозможно передать аргументы конструктора
  • ObjectProvider<Foo>#getObject(Object... args). Несколько бобовых матчей. Не могу выбрать A или B по имени

Кажется, мне нужно что-то вроде BeanFactory#getBean(String name, Class<T> requiredType, Object... args), но этого, похоже, не существует.

1 Ответ

0 голосов
/ 10 марта 2020

Я создал что-то, что работает, но я все еще надеюсь, что есть лучшее и более чистое решение:

    public Foo getFoo(String name, String arg) {
        if (beanFactory.containsBean(name) && beanFactory.isTypeMatch(name, Foo.class)) {
            return (Foo) beanFactory.getBean(name, arg);
        }
        throw new RuntimeException("nope!");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...