Spring
Типова структура Spring Boot-проєкту
COPY build/libs/app.jar app.jar
Він здатна використовуватися для: YouTrack
У контексті K2 ERP Spring здатна використовуватися для розробки backend-сервісів, API, інтеграційних модулів, batch-процесів, мікросервісів і допоміжних технічних компонентів. Він дає інструменти, але правильне розділення шарів, модель даних, безпека, транзакції, тести й DevOps залишаються відповідальністю команди. Він надає автоконфігурацію, starter-залежності, вбудовані web-сервери, Actuator, зручну структуру запуску і мінімум ручних налаштувань.== Spring MVC ==
- deployment;
- service;
- config maps;
- secrets;
- liveness probe;
- readiness probe;
- resource limits;
- autoscaling;
- logs;
- metrics;
- ingress;
- rolling update;
- rollback. testImplementation("org.springframework.boot:spring-boot-starter-test")
'''Spring Boot''' — це проєкт Spring, який спрощує створення самостійних production-ready застосунків.</div>
[[K2 Модуль Wix]]
<div style="background:#e8f5e9; border-left:5px solid #43a047; padding:12px; margin:12px 0;">
* імпорту файлів;
* експорту даних;
* нічних обробок;
* масового перерахунку;
* синхронізації каталогів;
* формування звітів;
* обробки банківських виписок;
* формування SAF-T UA;
* масового оновлення версій залишків;
* інтеграційних задач.<div style="background:#fff8e1; border-left:5px solid #f9a825; padding:12px; margin:12px 0;">
== Spring Actuator ==
== Spring Initializr ==
* обміну повідомленнями;
* інтеграції через файли;
* інтеграції через HTTP;
* інтеграції через черги;
* маршрутизації повідомлень;
* трансформації форматів;
* адаптерів до зовнішніх систем;
* побудови integration pipelines.== Spring у K2 ERP ==
== Джерела ==
<dependency>
com/example/app/
}
Типовий pipeline:
}
implementation("org.springframework.boot:spring-boot-starter-web")
'''Spring WebFlux''' — це reactive web framework у Spring. # Запускаються unit та integration tests. У production Actuator потрібно налаштовувати обережно, щоб не відкривати зайву технічну інформацію. Spring Data здатна використовуватися з:
* паролі;
* токени API;
* private keys;
* production connection strings;
* секрети електронного підпису;
* сертифікати;
* повні персональні інформаційні дані клієнтів;
* доступи до платіжних систем;
* доступи до ДПС;
* доступи до ЕДО;
* ключі до хмарних сервісів. '''Безпека:''' у Spring-застосунках не можна виводити в логи паролі, access tokens, private keys, повні реквізити платіжних карток, ключі електронного підпису або зайві персональні інформаційні дані. # Сервіс перетворює інформаційні дані у формат зовнішньої системи. # Статус повертається в K2 ERP.== Dependency Injection ==
com/example/app/
}
this.paymentService = paymentService;
== Обмеження та ризики ==
* швидкий старт проєкту;
* автоконфігурація;
* starter-залежності;
* вбудований Tomcat, Jetty або Undertow;
* запуск через java -jar;
* profiles;
* externalized configuration;
* Actuator;
* health checks;
* metrics;
* production-ready конфігурація;
* інтеграційні функції ERP з Maven і Gradle. # Застосунок розгортається в test. Найкраще Spring функціонує разом із Java, Gradle, TeamCity, Docker, PostgreSQL, YouTrack і DevOps-процесом. Spring створює bean, налаштовує його, передає залежності й контролює його життєвий цикл. На практиці Spring часто застосовується для разом зі Spring Boot. '''Spring Security''' — це проєкт для автентифікації, авторизації та захисту застосунків. Приклад Spring Data JPA repository:<syntaxhighlight lang="java">
port: 8080
[[Е-ТТН]]
[[DevOps]]
return orderService.getOrder(id);
[[Модуль Prom]]
* JPA;
* JDBC;
* R2DBC;
* MongoDB;
* Redis;
* Elasticsearch;
* Cassandra;
* Neo4j;
* іншими сховищами даних.== Spring і бази даних ==
[[K2 Модуль Magento]]
* сервісом;
* репозиторієм;
* контролером;
* конфігураційним класом;
* клієнтом зовнішнього API;
* компонентом інтеграції;
* обробником подій;
* валідатором;
* mapper-ом.== інформаційні дані, які не варто зберігати в коді ==
<div style="background:#e0f2f1; border-left:5px solid #00897b; padding:12px; margin:12px 0;">
Actuator здатна надавати:
* JUnit;
* Mockito;
* Spring Boot Test;
* MockMvc;
* TestRestTemplate;
* WebTestClient;
* Testcontainers;
* H2;
* WireMock. Він користувачі можуть розробнику не писати всю інфраструктуру вручну, а використовувати готові механізми для типових задач: створення об’єктів, підключення сервісів, робота з базами даних, транзакції, REST API, авторизація, конфігурація, тестування і взаємодія із зовнішніми системами. Він застосовують, коли потрібно для створення backend-сервісів забезпечується через '''Spring''' або '''Spring Framework'''. config/
[[ЕДО]]
* [https://docs.spring.io/spring-framework/reference/index.html Spring Framework Documentation]
* [https://spring.io/projects/spring-boot Spring Boot]
* [https://docs.spring.io/spring-boot/index.html Spring Boot Documentation]
* [https://start.spring.io/ Spring Initializr]
* [https://spring.io/projects/spring-data Spring Data]
* [https://spring.io/projects/spring-security Spring Security]
* [https://spring.io/projects/spring-batch Spring Batch]
* [https://spring.io/projects/spring-cloud Spring Cloud]
Spring добре вписується в DevOps-процес.[[Gradle]]
До основних переваг Spring можна віднести:
@Service
<groupId>org.springframework.boot</groupId>
public class OrderController {
[[K2 Модуль Shopify]]
Spring-проєкти зазвичай збираються через Maven або Gradle. Order order = orderService.create(request);
- Dependency Injection;
- Inversion of Control;
- конфігурацію застосунку;
- роботу з beans;
- AOP;
- транзакції;
- доступ до баз даних;
- інтеграцію з JPA і Hibernate;
- роботу з JDBC;
- REST API;
- Spring MVC;
- WebFlux;
- валідацію;
- обробку помилок;
- тестування;
- безпеку через Spring Security;
- batch-обробку;
- інтеграцію з чергами;
- роботу з подіями;
- конфігурацію через properties або YAML;
- actuator endpoint-и;
- інтеграцію з Docker і Kubernetes у production-сценаріях. # Image публікується в registry. }
- Spring JDBC;
- Spring Data JPA;
- Hibernate;
- Flyway;
- Liquibase;
- Transaction Management;
- connection pool;
- repository layer.
- PostgreSQL;
- MySQL;
- MariaDB;
- Oracle Database;
- Microsoft SQL Server;
- H2 для тестів;
- SQLite в окремих сценаріях. # Gradle виконує clean test build. Основні частини Spring Framework:
WORKDIR /app
Окремо варто відзначити вебзастосунків, мікросервісів, корпоративних систем, інтеграційних модулів, SaaS-платформ, ERP, CRM і інших бізнес-рішень виступає ключовою рисою розробки Java-застосунків. Не плутати: Spring MVC і Spring WebFlux — це різні web-підходи. }
Spring Cloud
У Kubernetes критично налаштувати: </syntaxhighlight>
Spring WebFlux
Spring Boot-застосунки часто упаковуються в Docker-образи. # Git commit. Spring надає інфраструктуру для керування залежностями, конфігурацією, транзакціями, вебзапитами, доступом до баз даних, безпекою, тестуванням, інтеграціями та побудовою масштабованих Java-застосунків. public OrderService(PaymentService paymentService) {
</syntaxhighlight>
Конфігурація
</syntaxhighlight> Офіційна сторінка Spring Boot описує його як інструмент, який дає можливість швидко створювати stand-alone, production-grade Spring based applications, які можна без зусиль запускати.== Spring Container == Типовий Spring-сервіс інтеграції здатна працювати так:
this.orderService = orderService;
ПРРО spring:
repository/
@Transactional
конкурентні переваги Spring
@RestController @RestController
Тестування Spring-застосунків
</syntaxhighlight>Docker дає можливість запускати Spring-сервіси однаково в local, test, staging і production. public void createOrder(CreateOrderRequest request) { Типові тести: @RequestMapping("/api/orders") Spring Data — це сімейство проєктів для спрощення роботи з даними. Він застосовується для для асинхронних і неблокуючих web-застосунків.ДПС
Spring Batch
Можливі помилки під час розробки
test/ resources/Практичне сценарії використання: Spring Boot найчастіше використовують для швидкого створення REST API, мікросервісів, backend-модулів, інтеграційних сервісів і корпоративних застосунків.
@Repository Для безпечної розробки на Spring потрібно контролювати: критично: Spring — це не одна бібліотека, а велика ERP-платформа. Spring Container відповідає за створення і керування beans. inventoryService.reserveItems(order);
}
@Bean
- зрілу екосистему;
- велику спільноту;
- зручний Dependency Injection;
- готові модулі для типових задач;
- Spring Boot для швидкого старту;
- хорошу підтримку REST API;
- зручну роботу з базами даних;
- транзакції;
- Spring Security;
- тестування;
- підтримку мікросервісів;
- інтеграцію з DevOps;
- підтримку Maven і Gradle;
- придатність для корпоративних систем. }
Spring Boot Actuator додає production-ready endpoint-и для моніторингу та керування застосунком. # У журналі зберігаються технічні інформаційні дані, помилки і результат обміну. # Сервіс перевіряє вхідні інформаційні дані. # За потреби виконується підписання, валідація або формування XML. * login;
- logout;
- roles;
- permissions;
- password hashing;
- JWT;
- OAuth2;
- OpenID Connect;
- CSRF protection;
- CORS configuration;
- method-level security;
- security filters;
- захист REST API. Через нього можна вибрати мову, build-систему, версію Spring Boot, залежності та отримати готовий шаблон проєкту.== Spring і Docker ==
Spring Batch — це фреймворк для batch-обробки великих обсягів даних. # Створюється Docker image. * документів ERP;
- оплат;
- складських рухів;
- замовлень;
- бухгалтерських проводок;
- резервів;
- інтеграцій із критичними даними. Вона дає можливість позначити метод як транзакційний, а Spring сам відкриє, підтвердить або відкотить транзакцію. Spring Security здатна забезпечувати:
Spring Data
url: jdbc:postgresql://localhost:5432/k2
Spring Boot
Spring здатна забезпечувати такі функції ERP:
Типові залежності: Spring застосовується для для розробки:
public OrderDto getOrder(@PathVariable Long id) {
Він виконує такі задачі: Bean здатна бути:
dto/
public class OrderService { @Component
</syntaxhighlight>У Spring залежність зазвичай передається через конструктор:
ENTRYPOINT ["java", "-jar", "app.jar"]
<div style="background:#ffebee; border-left:5px solid #e53935; padding:12px; margin:12px 0;">
src/
через Spring створений для спрощення розробки Java-застосунків. Він містить базові механізми для створення Java-застосунків. Приклад:<syntaxhighlight lang="java">
</div>
public class OrderService {
'''Для K2 ERP:''' Spring доцільно використовувати для backend-логіки, REST API, інтеграцій, batch-обробок і мікросервісів.[[LiqPay]]
'''Зверніть увагу:''' у розмовній мові «Spring» часто означає всю екосистему, а «Spring Boot» — конкретний інструмент для швидкого запуску Spring-застосунків із готовими налаштуваннями.== Beans ==
Spring здатна бути корисним для:
== Spring Security ==
Spring Framework можна використовувати без Spring Boot, але в сучасній розробці Spring Boot значно спрощує конфігурацію і запуск застосунків.<artifactId>spring-boot-starter-web</artifactId>
application.yml
* Java configuration;
* annotations;
* application.properties;
* application.yml;
* environment variables;
* profiles;
* command-line arguments;
* external configuration;
* configuration classes. * звернення до зовнішніх API;
* streaming;
* websocket;
* reactive pipelines;
* високонавантажені сервіси;
* асинхронна обробка даних. * service discovery;
* centralized configuration;
* API gateway;
* circuit breaker;
* distributed tracing;
* load balancing;
* cloud integrations;
* event-driven systems.== Spring і Kubernetes ==
Приклад Maven-залежності:
Типова структура здатна виглядати так:<syntaxhighlight lang="text">
* неправильна конфігурація beans;
* circular dependency;
* помилка dependency injection;
* неправильний profile;
* неправильна конфігурація datasource;
* помилки міграцій бази;
* LazyInitializationException;
* неправильні транзакції;
* N+1 query problem;
* неправильні security rules;
* відкриті Actuator endpoint-и;
* помилки JSON serialization;
* неправильна обробка exceptions;
* дублювання бізнес-логіки в controller;
* відсутність тестів;
* зберігання секретів у application.yml. # Отримується відповідь. # Spring-сервіс отримує запит через REST API або чергу.
Так код стає легше тестувати, підтримувати і змінювати. @GetMapping("/{id}")
Можна використовувати:
Spring — це одна з найпоширеніших екосистем для Java-розробки. Spring Boot дає можливість оперативно створювати stand-alone, production-grade Spring-застосунки, які можна запускати як звичайний Java-застосунок. Spring Initializr — це сервіс для швидкого створення Spring Boot-проєкту. це популярний фреймворк; так само реалізовано REST API. Це робить код зрозумілішим і спрощує тестування.</syntaxhighlight> Rider
Див. так само
} Типові СУБД:
java/
Під час використання Spring потрібно враховувати:
AppApplication.java
Приклад REST-контролера:
public interface OrderRepository extends JpaRepository<Order, Long> {
</div>
paymentService.reservePayment(order);
'''Не плутати:''' Spring не замінює архітектуру застосунку.<div style="background:#e8f4ff; border-left:5px solid #1e88e5; padding:12px; margin:12px 0;">
main/
List<Order> findByCustomerId(Long customerId);
Типові анотації:<syntaxhighlight lang="java">
Spring Boot-сервіси можуть запускатися в Kubernetes. До неї належать Spring Framework, Spring Boot, Spring Security, Spring Data, Spring Cloud, Spring Batch, Spring Integration та інші проєкти. Офіційна документація Spring Boot зазначає, що більшість Spring Boot-застосунків потребують мінімум Spring-конфігурації.== Висновок ==
Spring часто застосовується для з реляційними базами даних. # Виконуються smoke-тести. Офіційна документація Spring Framework охоплює IoC Container, Events, Resources, Validation, Data Binding, AOP, Testing, Data Access, Spring MVC, WebSocket і WebFlux. # Сервіс надсилає запит до зовнішнього API. entity/
FROM eclipse-temurin:21-jre
== Spring Transactions ==
Приклад application.yml:<syntaxhighlight lang="yaml">
== Spring Framework ==
Для роботи з базами можуть використовуватися:
service/
'''Для бізнес-систем:''' Spring Security важливий для ERP, CRM і SaaS, де потрібно контролювати ролі користувачів, доступ до документів, API, фінансових даних і адміністративних функцій. * HTTP endpoint-ів;
* REST API;
* web-контролерів;
* обробки JSON;
* валідації запитів;
* обробки помилок;
* роботи з path variables;
* роботи з query parameters;
* завантаження файлів;
* повернення HTTP-відповідей. username: k2_user
* Spring Security;
* автентифікацію;
* авторизацію;
* ролі;
* права доступу;
* захист REST API;
* CORS;
* CSRF для web-сценаріїв;
* JWT;
* OAuth2;
* OpenID Connect;
* валідацію вхідних даних;
* SQL injection;
* secrets management;
* dependency scanning;
* логування без секретів. '''Spring Integration''' — це проєкт для побудови інтеграційних потоків між системами. dependencies {
@Controller
@Configuration
'''Bean''' у Spring — це об’єкт, яким керує Spring Container. Вона дає можливість створювати backend-сервіси, REST API, web-застосунки, мікросервіси, ERP-модулі, інтеграційні сервіси та корпоративні системи. Для K2 ERP Spring здатна бути корисним як технологічна основа для Java backend-сервісів, інтеграцій із ДПС, ЕДО, ПРРО, LiqPay, Shopify, Magento, Wix, Prom, SAF-T UA, е-ТТН, batch-обробок і мікросервісів. Типовий Dockerfile:<syntaxhighlight lang="docker">
</div>
integration/
* REST API;
* backend-сервісів;
* вебзастосунків;
* мікросервісів;
* ERP-модулів;
* CRM-систем;
* SaaS-платформ;
* інтеграційних сервісів;
* сервісів обробки подій;
* систем електронного документообігу;
* платіжних модулів;
* сервісів роботи з базами даних;
* систем авторизації;
* batch-процесів;
* корпоративних застосунків.== Maven і Gradle у Spring ==
<div style="background:#ffebee; border-left:5px solid #e53935; padding:12px; margin:12px 0;">
Spring має розвинену підтримку тестування. Для цього потрібно використовувати змінні середовища або secret-сховища. # TeamCity запускає build. '''Dependency Injection''' — це підхід, коли залежності класу передаються зовні, а не створюються всередині самого класу. Такі інформаційні дані потрібно зберігати в захищених конфігураціях, secret-сховищах або змінних середовища. # Після підтвердження виконується deployment у production.
Транзакції особливо важливі для:
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
private final PaymentService paymentService;
Загальний SEO-опис
Для чого застосовується для Spring
- сканує компоненти;
- створює beans;
- передає залежності;
- читає конфігурацію;
- керує життєвим циклом об’єктів;
- застосовує AOP;
- забезпечує доступ до ApplicationContext. Spring MVC — це компонент для створення web-застосунків і REST API на основі servlet-моделі. Для більшості звичайних REST API достатньо Spring MVC, а WebFlux потрібен тоді, коли справді виступає як потреба в reactive-моделі. Воно оптимізує створювати репозиторії, працювати з базами даних і зменшувати кількість шаблонного коду. Він добре поєднується з Java, Gradle, TeamCity, Docker, PostgreSQL і DevOps-процесом. # Actuator і моніторинг перевіряють стан сервісу.TeamCity
Spring Framework — це основа екосистеми Spring. Spring MVC застосовується для для:
Spring Cloud здатна використовуватися для: WebFlux здатна бути корисним, коли платформа має багато одночасних I/O-операцій:
server:
- Spring Web;
- Spring Data JPA;
- Spring Security;
- PostgreSQL Driver;
- Validation;
- Actuator;
- Lombok;
- Flyway;
- Liquibase;
- Spring Batch. public OrderController(OrderService orderService) {
private final OrderService orderService;
- складність великої екосистеми;
- потребу в розумінні конфігурації;
- можливість прихованої автоконфігурації;
- складність Spring Security для новачків;
- ризик надмірної кількості залежностей;
- потребу в контролі версій;
- потребу в тестах;
- потребу в моніторингу;
- потребу в правильному налаштуванні production;
- ризик відкриття службових endpoint-ів.== Типовий сценарій Spring-сервісу для K2 ERP ==
java/
Spring підтримує різні способи конфігурації:
private PaymentService paymentService = new PaymentService();
Рекомендація: паролі, токени, private keys і production connection strings не варто зберігати у відкритому application.yml.== Безпека Spring-застосунків ==
Ключова ідея Spring — Inversion of Control і Dependency Injection. Без Dependency Injection клас здатна сам створювати залежності:
* REST API K2 ERP;
* інтеграцій із ДПС;
* інтеграцій із ПРРО;
* інтеграцій із LiqPay;
* інтеграцій із M.E.Doc;
* інтеграцій із EDIN;
* інтеграцій із СОТА;
* інтеграцій із FREDO;
* модулів Shopify;
* модулів Magento;
* модулів Wix;
* модуля Prom;
* формування SAF-T UA;
* обробки е-ТТН;
* роботи з чергами;
* batch-обробки;
* авторизації користувачів;
* роботи з PostgreSQL або іншими базами даних. Замість того щоб кожен клас сам створював потрібні йому залежності, Spring керує об’єктами застосунку та передає залежності автоматизовано.== Spring Integration ==
== Основні функції ERP Spring ==
Spring має зручну модель керування транзакціями.== Spring і DevOps ==
# K2 ERP створює документ або подію.
- unit-тести сервісів;
- repository-тести;
- controller-тести;
- integration-тести;
- API-тести;
- contract-тести;
- тести транзакцій;
- тести інтеграцій із зовнішніми API. datasource:
Типові функції ERP Spring Boot:
}
- health check;
- metrics;
- info;
- environment;
- beans;
- mappings;
- loggers;
- readiness;
- liveness;
- custom health indicators. Spring Cloud — це набір інструментів для мікросервісної та cloud-native архітектури. У Spring-проєкті не варто зберігати безпосередньо в коді:
</dependency>
Під час роботи зі Spring можуть виникати такі помилки:
- Core Container;
- Beans;
- Context;
- Expression Language;
- AOP;
- Data Access;
- Transactions;
- Web MVC;
- WebFlux;
- Testing. Рекомендація: у Spring-проєктах бажано розділяти controller, service, repository, dto, entity, config та integration-шари. Він здатна використовуватися для:
controller/
@Service