Динамический код в Spring Boot приложении

Появилась задача разработать простой сервис, который переодически получает из базы данных clob'ы с файлами, и в зависимости от их типа, обрабатывает их. Типов файлов с десяток, обработка с одной стороны простая, с другой - сильно отличается в зависимости от типа. Можно, конечно, сделать десяток реализаций класса обработчика и обновлять приложение, если появятся новые типы.

Но, может быть, возможно динамически для каждого типа файла подгружать подходящий обработчик (Groovy или откомпилированный класс) из внешнего источника? Стоит ли с этим связываться? И как, в таком случае, из скрипта получить доступ до бинов основного приложения, нет ли с этим проблем?


Ответы (1 шт):

Автор решения: Igor M.

Ваша идея имеет право на жизнь и я видел успешные примеры подобного решения.

Исполнение на лету нужного Groovy-скрипта для каждого случая задача весьма типовая, особенно в DevOps.

Чтобы скрипт мог работать с экземплярами Spring-бинов, их необходимо передавать в скрипт явным образом через механизм биндинга:

Binding bindings = new Binding();
bindings.setProperty('myBean', beanInstance); 
GroovyShell shell = new GroovyShell(bindings);
shell.evaluate("myBean.myBeanMethod()"); // здесь переданная строка - это уже скрипт
→ Ссылка