Spring Boot + Python: від експерименту до open-source
Вступ
У 2024 році я почав вивчати Spring AOP і вирішив перевіряти знання на практиці — створив експериментальний проєкт.
Ідея була простою: щось унікальне та реально корисне. У Java майже немає сучасних бібліотек для інтеграції з Python. Py4J і Jython або обмежені, або застарілі, а повноцінної інтеграції зі Spring Boot не існувало.
Так я вирішив створити бібліотеку для зв’язку Java та Python. Спочатку це був експеримент з AOP і динамічним кодом, але згодом проєкт виріс у повноцінну open-source бібліотеку, яку можна підключити однією залежністю.
Початок експерименту: вивчення AOP у Spring Boot
Спочатку проєкт під назвою spring-python-executor позиціонувався як звичайний приклад моїх навичок для резюме й нічого більше. Тому до середини 2024 я швидко завершив розробку. Код був «на костилях», про безпеку чи довгострокову розширюваність не йшлося, але воно працювало.
Перша версія працювала на шести анотаціях:
@PythonBeforeMethod@PythonAfterMethod@Py4JBeforeMethod@Py4JAfterMethod@SpelythonBeforeMethod@SpelythonAfterMethod
@PythonBeforeMethod і @PythonAfterMethod працювали зі звичайними скриптами, незалежними від Py4J або Spring Boot.
@Py4JBeforeMethod і @Py4JAfterMethod відповідали за використання Py4J разом зі скриптом, вказаним у методі.
@SpelythonBeforeMethod і @SpelythonAfterMethod були «родзинкою» версії. Вони реалізовували Spelython (SpEL + Python), дозволяючи використовувати SpEL-вирази в кожному скрипті.
Я вирішив викласти цю версію в Maven Central Repository за гайдом з YouTube, думаючи, що вона «пройде» без належного тестування.
P.S. Вона не запрацювала — я забув додати spring.factories.
Другий етап експерименту: виправлення та усвідомлення
У 2025 я вирішив повністю оновити своє резюме й перевірити працездатність проєктів. Як ви вже здогадалися, spring-python-executor не виправдав очікувань...
Я почав глибше вивчати екосистему Spring Boot і створення Java-проєктів, які не соромно публікувати в Maven Central.
Прочитавши документацію, я почав виправляти старі помилки. Логічні помилки усувалися за кілька десятків хвилин, але глобальною проблемою була складність розширення коду. Виконання скриптів через ProcessBuilder теж виявилося не найкращим рішенням.
Я дійшов висновку, що треба розділити «спагеті-код» на модулі й додати більше варіантів виконання скриптів, наприклад через REST або gRPC.
Перед цим я додав підтримку RestrictedPython і зрозумів, що 6 анотацій — це надмір, тож потрібно змінювати контракти між інтерфейсами.
Фінальний етап: перехід до production-ready коду
Перейменувавши проєкт у spring-boot-python-executor та розділивши його на модулі (spring-boot-python-executor-common, spring-boot-python-executor-core, spring-boot-python-autoconfigure, spring-boot-python-executor-starter), я значно покращив якість коду та розширюваність.
Першим кроком у рефакторингу стало виправлення контрактів між інтерфейсами й створення централізованого PythonProcessor для виконання Python-скриптів, прибравши надмірну кількість анотацій.
Тепер залишилося лише 4 анотації:
@PythonBefores@PythonBefore@PythonAfters@PythonAfter
Анотації з ...s виконують кілька анотацій без s. Також додано профілювання.
За Spelython або Py4J відповідає PythonResolverHolder зі списком потрібних PythonResolver.
За спосіб виконання скриптів відповідає PythonExecutor, який тепер має дві реалізації: GrpcPythonExecutor і RestPythonExecutor.
Я створив два Python-сервери й виклав їх у Docker Hub:
w4t3rcs/spring-boot-python-executor-python-grpc-serverw4t3rcs/spring-boot-python-executor-python-rest-server
«Вишенькою на торті» стало додавання модулів для кешування та testcontainers.
Приклади використання


Детальніше про бібліотеку можна дізнатися з README.md і Javadoc у репозиторії проєкту (github.com/...ring-boot-python-executor).
Висновок
За рік мій маленький експеримент перетворився на повноцінний open-source проєкт з гнучкою архітектурою, підтримкою REST, gRPC і безпечного виконання Python-скриптів. Зараз spring-boot-python-executor вже можна використовувати у production, підключивши всього одну залежність.
Далі планую розширювати функціонал, покращувати документацію та додавати приклади реальних сценаріїв.
А тепер питання до вас:
- Чи поверталися ви до своїх старих незавершених проєктів?
- Чи доводилося вам інтегрувати Python і Java в одному проєкті?
- Який спосіб взаємодії між ними для вас найзручніший?
- Чи цікава вам ідея глибокої інтеграції Python у Spring Boot?
Давайте обговоримо це в коментарях! Буду радий зворотному зв’язку та вашим ідеям для розвитку проєкту!
12 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів