Создание компонента по требованию с определенной во время выполнения конфигурацией - PullRequest
0 голосов
/ 19 января 2020

В моем приложении я хотел бы создать экземпляр класса по требованию и передать некоторые параметры времени выполнения, а также чтобы Spring автоматически выполнял любые @Autowired зависимости. Например, класс, который я хотел бы создать по требованию:

@Service
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class FileProcess implements Runnable
{
    @Autowired
    private MyDAO myDAO;

    private String configOne;

    private String configTwo;

    @Override
    public void run()
    {
    }
}

Объект myDAO уже существует в ApplicationContext, и я бы хотел, чтобы Spring выполнил эту зависимость для меня. На самом деле, любое создание этого класса не должно знать внутренности FileProcess только потому, что для этого требуются параметры конфигурации configOne и configTwo

Чтобы получить экземпляр FileProcess Я использовал getBean() метод ApplicationContext, но я не могу передать только параметры конфигурации:

final FileProcess fileProcess = this.applicationContext.getBean(FileProcess.class, configOne, configTwo)

Это приводит к ошибке:

Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities

Я обнаружил, что независимо от того, какой конструктор я добавляю к FileProcess, я получаю одну и ту же ошибку. Я хотел бы только передать параметры конфигурации, а не, в этом случае не экземпляр MyDAO. Опять же, необходимость передать экземпляр MyDAO означает, что вызывающий объект должен знать внутренние компоненты FileProcess и в целом должен знать о сфере действия таких компонентов.

Есть ли способ, которым я могу этого достичь без необходимости прибегать к @Configuration классу и @Bean аннотированному методу?

1 Ответ

1 голос
/ 19 января 2020

Я думаю, вам лучше использовать фабричный компонент, например

@Bean
BiFunction<String, String, FileProcess> createFileProcess(MyDAO dao) {
    return (c1, c2) -> {
        FileProcess result = new FileProcess(dao) ;
        result.setConfig1(c1);
        result.setConfig2(c2);
        return result;
   };
}

Это в классе конфигурации, и вы можете автоматически связать его для создания объекта процесса с вашими значениями конфигурации.

@Autowired
BiFunction<String, String, FileProcess> processFactory;
... 
FileProcess p = processFactory.apply("val1", "val2");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...