Динамический код в Spring Boot приложении
Появилась задача разработать простой сервис, который переодически получает из базы данных clob'ы с файлами, и в зависимости от их типа, обрабатывает их. Типов файлов с десяток, обработка с одной стороны простая, с другой - сильно отличается в зависимости от типа. Можно, конечно, сделать десяток реализаций класса обработчика и обновлять приложение, если появятся новые типы.
Но, может быть, возможно динамически для каждого типа файла подгружать подходящий обработчик (Groovy или откомпилированный класс) из внешнего источника? Стоит ли с этим связываться? И как, в таком случае, из скрипта получить доступ до бинов основного приложения, нет ли с этим проблем?
Ответы (1 шт):
Ваша идея имеет право на жизнь и я видел успешные примеры подобного решения.
Исполнение на лету нужного Groovy-скрипта для каждого случая задача весьма типовая, особенно в DevOps.
Чтобы скрипт мог работать с экземплярами Spring-бинов, их необходимо передавать в скрипт явным образом через механизм биндинга:
Binding bindings = new Binding();
bindings.setProperty('myBean', beanInstance);
GroovyShell shell = new GroovyShell(bindings);
shell.evaluate("myBean.myBeanMethod()"); // здесь переданная строка - это уже скрипт