Просто хочу понять сколько подписчиков из общего количества читает посты. Прочитал - нажми че-нибудь уже ☺️
Anonymous Poll
58%
29%
26%
👍1
Что выведет код?
#Tasks
import java.util.function.Function;
public class Task250925 {
public static void main(String[] args) {
Function<Integer, Integer> plus5 = x -> x + 5;
Function<Integer, Integer> times2 = x -> x * 2;
Function<Integer, Integer> composed = plus5.compose(times2);
System.out.println(composed.apply(3));
}
}
#Tasks
👍3
Вопрос с собеседований
Что такое String Pool?🤓
Ответ:
String Pool— это область памяти, где JVM хранит уникальные строковые литералы.
Если создать строку через "abc", то повторное использование этой же строки вернёт ссылку на уже существующий объект.
Это экономит память и ускоряет сравнение строк.
#собеседование
Что такое String Pool?
Ответ:
String Pool
Если создать строку через "abc", то повторное использование этой же строки вернёт ссылку на уже существующий объект.
Это экономит память и ускоряет сравнение строк.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Владимир Иосифович Гурман (26 сентября 1934, Москва — 8 июня 2016, Переславль-Залесский) — советский/российский учёный, специалист в области оптимального управления и разработок алгоритмов для систем управления; главный научный сотрудник Института программных систем РАН.
Влади́мир Никано́рович Реме́сленников (26 сентября 1938, Ишим, Тюменская область, СССР — 13 мая 2025, Омск, Россия) — советский/российский математик, занимался алгоритмами и компьютерной поддержкой исследований в теории групп; работал над системой «Magnus» — системой компьютерной поддержки исследований в алгебре групп.
Кристель Байер (родилась 26 сентября 1965 г.) — немецкий теоретик компьютерных наук; известна работами по моделям проверки (model checking), временной логике и автоматам.
Илкка Туоми (родился 26 сентября 1958 года) — финский исследователь интернета и теории открытых инноваций; автор статей по эволюции открытого программного обеспечения и роли интернет-инноваций.
1983 — Ложное срабатывание системы «Око» и решение Станислава Петрова.
В ночь на 26 сентября система предупреждения о ракетном нападении «Око» сигнализировала о запуске американских межконтинентальных баллистических ракет. Оперативным дежурным заявил, что это ложная тревога — именно этот шаг мог предотвратить ядерную войну.
2003 — остановлена работа Нупедии, предшественника Википедии.
#Biography #Birth_Date #Events #26Сентября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Реактивное программирование
Концепции реактивного программирования: Backpressure — что делать, если данных слишком много
Представьте: источник данных — как бурная река, а ваш подписчик — маленькая лодка. Если вода хлынет слишком быстро в лодку, она утонет.
Здесь на помощь приходит backpressure (обратное давление) — механизм, который позволяет подписчику контролировать скорость потока, говоря "дай мне столько, сколько я могу переварить". И это не просто тормоз, а умный регулятор, который предотвращает перегрузки и делает реактивные системы устойчивыми под любой нагрузкой.
Backpressure — ключевая фишка реактивного программирования, которая отличает его от традиционных подходов. В старых моделях (как потоки или Future) вы либо блокируете всё, либо тонете в очередях данных, рискуя исчерпать память или CPU. Здесь же контроль у потребителя: он решает, когда и сколько брать. Это решает проблемы callback-ада и блокировок, позволяя строить масштабируемые приложения — от мобильных до облачных кластеров.
Что такое backpressure и почему оно нужно?
Обратное давление — это способ, при котором получатель данных сигнализирует источнику: "замедлись, если я не успеваю". В реактивном мире данные передаются асинхронно, но без контроля это может привести к проблемам: если издатель генерирует 1 млн элементов в секунду, а подписчик обрабатывает только 100, буфер переполнится, и приложение упадёт с ошибкой "израсходована память" (OutOfMemoryError).
Backpressure вводит "обратную связь": подписчик запрашивает элементы порциями, а издатель выдаёт ровно столько.
Это встроено в Reactive Streams: в методе onSubscribe подписчик получает Subscription и использует request(long n) — "запроси n элементов". Если не запросить — данные не потекут. Это как шлюзы на реке: открываешь по мере нужды, избегая наводнения. В отличие от pull-модели (где вы тянете всё сразу), здесь баланс: push для динамики, но с контролем.
Пример базового использования в Flux (поток для множества элементов):
#Java #middle #Reactor #Reactive_Streams_API #backpressure
Концепции реактивного программирования: Backpressure — что делать, если данных слишком много
Представьте: источник данных — как бурная река, а ваш подписчик — маленькая лодка. Если вода хлынет слишком быстро в лодку, она утонет.
Здесь на помощь приходит backpressure (обратное давление) — механизм, который позволяет подписчику контролировать скорость потока, говоря "дай мне столько, сколько я могу переварить". И это не просто тормоз, а умный регулятор, который предотвращает перегрузки и делает реактивные системы устойчивыми под любой нагрузкой.
Backpressure — ключевая фишка реактивного программирования, которая отличает его от традиционных подходов. В старых моделях (как потоки или Future) вы либо блокируете всё, либо тонете в очередях данных, рискуя исчерпать память или CPU. Здесь же контроль у потребителя: он решает, когда и сколько брать. Это решает проблемы callback-ада и блокировок, позволяя строить масштабируемые приложения — от мобильных до облачных кластеров.
Что такое backpressure и почему оно нужно?
Обратное давление — это способ, при котором получатель данных сигнализирует источнику: "замедлись, если я не успеваю". В реактивном мире данные передаются асинхронно, но без контроля это может привести к проблемам: если издатель генерирует 1 млн элементов в секунду, а подписчик обрабатывает только 100, буфер переполнится, и приложение упадёт с ошибкой "израсходована память" (OutOfMemoryError).
Backpressure вводит "обратную связь": подписчик запрашивает элементы порциями, а издатель выдаёт ровно столько.
Это встроено в Reactive Streams: в методе onSubscribe подписчик получает Subscription и использует request(long n) — "запроси n элементов". Если не запросить — данные не потекут. Это как шлюзы на реке: открываешь по мере нужды, избегая наводнения. В отличие от pull-модели (где вы тянете всё сразу), здесь баланс: push для динамики, но с контролем.
Пример базового использования в Flux (поток для множества элементов):
import reactor.core.publisher.Flux;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
Flux<Integer> fastPublisher = Flux.range(1, 1000); // Быстрый источник: 1000 элементов
fastPublisher.subscribe(new Subscriber<Integer>() {
private Subscription sub;
@Override
public void onSubscribe(Subscription s) {
sub = s;
sub.request(5); // Сначала запрашиваем 5 элементов
}
@Override
public void onNext(Integer item) {
System.out.println("Обработано: " + item);
// Симулируем медленную обработку: Thread.sleep(100); (но в реальности избегайте блокировок!)
sub.request(1); // После каждого — запрашиваем следующий
}
@Override
public void onError(Throwable t) { /* обработка */ }
@Override
public void onComplete() { System.out.println("Готово"); }
});
Здесь подписчик контролирует темп: запросил 5 — получил 5, обработал — запросил ещё. Если не request() — поток остановится. Это асинхронно: издатель не блокируется, а ждёт сигналов.
#Java #middle #Reactor #Reactive_Streams_API #backpressure
👍2
Стратегии обработки backpressure: что если запросов мало?
Не всегда подписчик может обрабатывать всё. Reactive Streams не диктует, что делать при переполнении — это на усмотрение реализации (как Reactor).
Вот стратегии, чтобы не упасть:
- BUFFER (буферизация): Копирует лишние элементы в очередь (буфер). Полезно для временных пиков, но рискуете памятью при бесконечном потоке. В Reactor: .onBackpressureBuffer().
- DROP (сброс): Игнорирует лишние элементы, пока подписчик не запросит. Для сценариев, где свежие данные важнее старых (например, мониторинг). .onBackpressureDrop().
- LATEST (последний): Сохраняет только самый свежий элемент, сбрасывая предыдущие. Идеально для UI-обновлений (как курс валют). .onBackpressureLatest().
- ERROR (ошибка): Если буфер полон — кидает исключение (IllegalStateException). Для строгих систем, где потеря данных недопустима. .onBackpressureError().
Пример с DROP в Reactor:
Практические советы и подводные камни
- Всегда вызывайте request() в onSubscribe, иначе ничего не потечёт. Для неограниченного — request(Long.MAX_VALUE), но только если уверены в памяти.
- Избегайте блокировок в onNext: если обработка медленная, offload на другой Scheduler (в Reactor: .publishOn(Schedulers.parallel())).
- Тестируйте под нагрузкой: используйте TestPublisher/TestSubscriber для симуляции быстрых/медленных сценариев.
- Камень: бесконечные потоки без стратегии — рецепт OOM. Всегда добавляйте .onBackpressureBuffer(размер) или drop.
В реальной жизни: в Spring WebFlux backpressure работает сквозь стек — от БД (reactive драйверы) до клиента. Например, стриминг больших файлов: клиент запрашивает chunks, сервер толкает по мере.
#Java #middle #Reactor #Reactive_Streams_API #backpressure
Не всегда подписчик может обрабатывать всё. Reactive Streams не диктует, что делать при переполнении — это на усмотрение реализации (как Reactor).
Вот стратегии, чтобы не упасть:
- BUFFER (буферизация): Копирует лишние элементы в очередь (буфер). Полезно для временных пиков, но рискуете памятью при бесконечном потоке. В Reactor: .onBackpressureBuffer().
- DROP (сброс): Игнорирует лишние элементы, пока подписчик не запросит. Для сценариев, где свежие данные важнее старых (например, мониторинг). .onBackpressureDrop().
- LATEST (последний): Сохраняет только самый свежий элемент, сбрасывая предыдущие. Идеально для UI-обновлений (как курс валют). .onBackpressureLatest().
- ERROR (ошибка): Если буфер полон — кидает исключение (IllegalStateException). Для строгих систем, где потеря данных недопустима. .onBackpressureError().
Пример с DROP в Reactor:
Flux.interval(Duration.ofMillis(1)) // Бесконечный поток: элемент каждую мс
.onBackpressureDrop(dropped -> System.out.println("Сброшено: " + dropped)) // Стратегия: сбрасываем лишнее
.subscribe(item -> {
try { Thread.sleep(100); } catch (InterruptedException e) {} // Медленный подписчик
System.out.println("Обработано: " + item);
});
Здесь быстрый Flux "замедляется" под подписчика: лишние элементы сбрасываются, система не падает.
Ещё опция — cancel(): подписчик может полностью отменить подписку, если данных слишком много или не нужно.
Практические советы и подводные камни
- Всегда вызывайте request() в onSubscribe, иначе ничего не потечёт. Для неограниченного — request(Long.MAX_VALUE), но только если уверены в памяти.
- Избегайте блокировок в onNext: если обработка медленная, offload на другой Scheduler (в Reactor: .publishOn(Schedulers.parallel())).
- Тестируйте под нагрузкой: используйте TestPublisher/TestSubscriber для симуляции быстрых/медленных сценариев.
- Камень: бесконечные потоки без стратегии — рецепт OOM. Всегда добавляйте .onBackpressureBuffer(размер) или drop.
В реальной жизни: в Spring WebFlux backpressure работает сквозь стек — от БД (reactive драйверы) до клиента. Например, стриминг больших файлов: клиент запрашивает chunks, сервер толкает по мере.
#Java #middle #Reactor #Reactive_Streams_API #backpressure
👍3
Есть идея, создать закрытый чат, для тех кто хочет неформального активного общения и обсуждений, с строгими правилами.
Вы бы присоединились?
Вы бы присоединились?
Anonymous Poll
58%
Да, выглядит многообещающе 🙂
33%
Наверно, но чем он лучше нынешнего, мертвого чата? 🤷♀️
8%
Нет, мне это не интересно 👎
👍1
Что выведет код?
#Tasks
public class Task260925 {
public static void main(String[] args) {
String a = "hello";
String b = "he" + "llo";
String c = "he";
String d = "llo";
String e = c + d;
String f = (c + d).intern();
System.out.print((a == b) + " ");
System.out.print((a == e) + " ");
System.out.print((a == f) + " ");
System.out.print(a.equals(e));
}
}
#Tasks
👍2
Варианты ответа:
Anonymous Quiz
31%
true false true true
38%
true true false true
23%
false true true false
8%
true false false true
🔥5
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓
Голосуем за тему к рассмотрению в эти выходные!
Выбираем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)
Не стесняемся!✌️
Голосуем за тему к рассмотрению в эти выходные!
Выбираем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)
Не стесняемся!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Вопрос с собеседований
Чем отличается процесс от потока?🤓
Ответ:
Процесс — это экземпляр программы со своей памятью и ресурсами.
Потоки живут внутри процесса и делят общую память.
Потоки легче и быстрее переключаются, но требуют аккуратной синхронизации, чтобы избежать состояния гонки и неконсистентности данных.
#собеседование
Чем отличается процесс от потока?
Ответ:
Процесс
Потоки живут внутри процесса и делят общую память.
Потоки легче и быстрее переключаются, но требуют аккуратной синхронизации, чтобы избежать состояния гонки и неконсистентности данных.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Ларри Уолл (англ. Larry Wall; род. 1954) — американский программист. Знаменит как создатель языка программирования Perl. Лингвист по образованию. Автор клиента Usenet и широкоиспользуемой программы patch. Он дважды побеждал в международном конкурсе запутанного кода на языке программирования Си (IOCCC) и был лауреатом первой награды Free Software Foundation за продвижение свободного программного обеспечения (Free Software Foundation Award for the Advancement of Free Software) в 1998 году.
1905 — Альберт Эйнштейн опубликовал работу «Зависит ли инерция тела от содержащейся в нём энергии?», в которой предлагалось знаменитое E=mc².
1983 — Ричард Столлман объявил, что в рамках проекта GNU должна быть создана UNIX-совместимая операционная система.
2007 — с космодрома Канаверал с помощью ракеты-носителя Дельта-2 запущена американская АМС Dawn (Рассвет), предназначенная для исследования астероидов Веста и Церера.
#Biography #Birth_Date #Events #27Сентября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
С 20.09 по 26.09
Предыдущий пост(с 13.09 по 19.09)
Воскресный мотивационный пост:
Ты не старый. Ты опытный.
Выбранная голосованием тема:
не было
Запись встреч/видео:
Spring AI Настройка и запуск. Историчность и RAG
Обучающие статьи:
Реактивное программирование
Концепции реактивного программирования:
Push vs Pull — кто управляет данными
Reactive Streams API — Publisher и Subscriber
Backpressure — что делать, если данных слишком много
Java:
Принципы проектирования и хорошего кода:
DRY, KISS, YAGNI
Композиция vs Наследование
Полезные статьи и видео:
Проектирование БД рекомендательной системы по подходу DB-first
Что нового в Maven 4?
Три друга выбрали разные пути в IT. Какой Результат?
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
Предыдущий пост(с 13.09 по 19.09)
Воскресный мотивационный пост:
Ты не старый. Ты опытный.
Выбранная голосованием тема:
не было
Запись встреч/видео:
Spring AI Настройка и запуск. Историчность и RAG
Обучающие статьи:
Реактивное программирование
Концепции реактивного программирования:
Push vs Pull — кто управляет данными
Reactive Streams API — Publisher и Subscriber
Backpressure — что делать, если данных слишком много
Java:
Принципы проектирования и хорошего кода:
DRY, KISS, YAGNI
Композиция vs Наследование
Полезные статьи и видео:
Проектирование БД рекомендательной системы по подходу DB-first
Что нового в Maven 4?
Три друга выбрали разные пути в IT. Какой Результат?
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
👍4
Введение в GraphQL
GraphQL — это язык запросов для приложения, который позволяет клиентам (например, мобильным приложениям или веб-сайтам) запрашивать ровно те данные, которые им нужны, без лишнего. Он был создан компанией Facebook в 2012 году и стал открытым стандартом в 2015. В отличие от традиционных подходов, где сервер диктует, какие данные отдавать, здесь клиент сам формирует запрос. Это делает систему гибкой и эффективной.
Почему GraphQL вместо привычных методов?
Представь, что у тебя есть интернет-магазин. В старом подходе, называемом REST (это аббревиатура от "Representational State Transfer", что значит "передача состояния представления" — способ организации API, где каждый запрос идёт по фиксированному адресу), ты бы создал отдельные точки входа: одну для списка товаров, другую для деталей пользователя, третью для отзывов. Клиент запрашивает всё сразу, даже если ему нужно только имя товара и цена — и получает кучу лишних данных. Это тратит трафик и замедляет приложение.
GraphQL решает это одной точкой входа (обычно /graphql). Клиент пишет запрос на языке, похожем на JSON, указывая, какие поля нужны. Сервер возвращает только их.
Плюсы:
Меньше запросов: Можно получить данные из нескольких источников за один раз.
Типизация: Всё строго описано в схеме (это как каркас данных, где указано, какие типы полей и как они связаны).
Версионирование не нужно: Клиенты сами выбирают, что запрашивать, без изменений в API.
Интроспекция: Клиент может "спросить" сервер о доступных данных.
В экосистеме Java GraphQL интегрируется легко, особенно с Spring Boot — это фреймворк для быстрой разработки приложений на Java, который упрощает настройку серверов. Есть библиотека graphql-java, но для Spring лучше использовать spring-graphql — она берёт на себя интеграцию.
Настройка проекта: Шаги для старта
Давай создадим простой проект. Предполагаем, у тебя есть Java 17+ и Maven (система сборки проектов). Если новичок, скачай Spring Initializr с сайта spring.io — это онлайн-генератор проектов.
Создай проект Spring Boot с зависимостями:
Spring Web (для HTTP-сервера).
Spring GraphQL (для поддержки GraphQL).
Spring Data JPA (если нужно база данных, для хранения данных).
H2 Database (встроенная база для тестов).
В файле pom.xml (это конфигурация Maven) добавь:
Определи схему. Схема — это файл с описанием типов данных.
Создай файл schema.graphqls в resources/graphql:
Создай модель данных. В Java это классы с аннотациями (метками для фреймворка).
Для книги:
#Java #middle #on_request #GraphQL
GraphQL — это язык запросов для приложения, который позволяет клиентам (например, мобильным приложениям или веб-сайтам) запрашивать ровно те данные, которые им нужны, без лишнего. Он был создан компанией Facebook в 2012 году и стал открытым стандартом в 2015. В отличие от традиционных подходов, где сервер диктует, какие данные отдавать, здесь клиент сам формирует запрос. Это делает систему гибкой и эффективной.
Почему GraphQL вместо привычных методов?
Представь, что у тебя есть интернет-магазин. В старом подходе, называемом REST (это аббревиатура от "Representational State Transfer", что значит "передача состояния представления" — способ организации API, где каждый запрос идёт по фиксированному адресу), ты бы создал отдельные точки входа: одну для списка товаров, другую для деталей пользователя, третью для отзывов. Клиент запрашивает всё сразу, даже если ему нужно только имя товара и цена — и получает кучу лишних данных. Это тратит трафик и замедляет приложение.
GraphQL решает это одной точкой входа (обычно /graphql). Клиент пишет запрос на языке, похожем на JSON, указывая, какие поля нужны. Сервер возвращает только их.
Плюсы:
Меньше запросов: Можно получить данные из нескольких источников за один раз.
Типизация: Всё строго описано в схеме (это как каркас данных, где указано, какие типы полей и как они связаны).
Версионирование не нужно: Клиенты сами выбирают, что запрашивать, без изменений в API.
Интроспекция: Клиент может "спросить" сервер о доступных данных.
В экосистеме Java GraphQL интегрируется легко, особенно с Spring Boot — это фреймворк для быстрой разработки приложений на Java, который упрощает настройку серверов. Есть библиотека graphql-java, но для Spring лучше использовать spring-graphql — она берёт на себя интеграцию.
Настройка проекта: Шаги для старта
Давай создадим простой проект. Предполагаем, у тебя есть Java 17+ и Maven (система сборки проектов). Если новичок, скачай Spring Initializr с сайта spring.io — это онлайн-генератор проектов.
Создай проект Spring Boot с зависимостями:
Spring Web (для HTTP-сервера).
Spring GraphQL (для поддержки GraphQL).
Spring Data JPA (если нужно база данных, для хранения данных).
H2 Database (встроенная база для тестов).
В файле pom.xml (это конфигурация Maven) добавь:
xml<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-graphql</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
Определи схему. Схема — это файл с описанием типов данных.
Создай файл schema.graphqls в resources/graphql:
graphqltype Query {
bookById(id: ID): Book
allBooks: [Book]
}
type Book {
id: ID
title: String
author: Author
}
type Author {
id: ID
name: String
books: [Book]
}
Здесь Query — это корневой тип для запросов. ID — уникальный идентификатор, String — текст. [Book] значит список книг. Это позволяет запрашивать книги с авторами, и сервер сам свяжет данные.
Создай модель данных. В Java это классы с аннотациями (метками для фреймворка).
Для книги:
javaimport jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
@Entity
public class Book {
@Id
private Long id;
private String title;
@ManyToOne
private Author author;
// Геттеры и сеттеры (методы для чтения и записи полей)
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public Author getAuthor() { return author; }
public void setAuthor(Author author) { this.author = author; }
}
#Java #middle #on_request #GraphQL
🔥3👍1
Репозитории для доступа к данным. Spring Data упрощает это:
Резолверы: Где происходит магия
Резолверы — это методы, которые "разрешают" запросы, то есть вычисляют данные.
В Spring создай класс:
Чтобы связать автора с книгами, добавь резолвер для типа Book:
Запуск и тестирование
В основном классе приложения (обычно с @SpringBootApplication) ничего менять не нужно — Spring сам настроит /graphql.
Запусти приложение:
Теперь протестируй в инструменте вроде GraphiQL (встроен в Spring GraphQL, доступен по /graphiql).
Пример запроса:
Сервер вернёт:
Только то, что запрошено! Если нужно мутации (изменения данных), добавь type Mutation в схему и резолверы для createBook и т.д.
Продвинутые советы для опытных
Обработка ошибок: Используй GraphQLError для кастомных сообщений.
Производительность: Добавь DataLoader для batch-запросов, чтобы избежать N+1 проблемы (когда для списка из N элементов делается N запросов в базу).
Безопасность: Включи аутентификацию с Spring Security, ограничи поля по ролям.
Интеграция с другими сервисами: GraphQL может агрегировать данные из микросервисов.
Пример с DataLoader для оптимизации:
Сначала добавь зависимость graphql-java-tools.
Затем в конфигурации:
В резолвере используй контекст для загрузки.
Это делает систему масштабируемой.
#Java #middle #on_request #GraphQL
javaimport org.springframework.data.jpa.repository.JpaRepository;
public interface BookRepository extends JpaRepository<Book, Long> {
}
Это интерфейс, который автоматически генерирует методы вроде findById.
Резолверы: Где происходит магия
Резолверы — это методы, которые "разрешают" запросы, то есть вычисляют данные.
В Spring создай класс:
javaimport graphql.kickstart.tools.GraphQLQueryResolver;
import org.springframework.beans.factory.annotation.Autowired;
public class QueryResolver implements GraphQLQueryResolver {
@Autowired
private BookRepository bookRepository;
public Book bookById(Long id) {
return bookRepository.findById(id).orElse(null); // Возвращает книгу или null, если не найдена
}
public List<Book> allBooks() {
return bookRepository.findAll(); // Все книги
}
}
@Autowired — это инъекция зависимости, Spring сам подставит репозиторий. Для автора аналогично создай AuthorResolver для поля books.
Чтобы связать автора с книгами, добавь резолвер для типа Book:
javaimport graphql.kickstart.tools.GraphQLResolver;
public class BookResolver implements GraphQLResolver<Book> {
public Author author(Book book) {
return book.getAuthor(); // Просто возвращает автора из модели
}
}
Это позволяет в запросе GraphQL получить автора без дополнительных усилий.
Запуск и тестирование
В основном классе приложения (обычно с @SpringBootApplication) ничего менять не нужно — Spring сам настроит /graphql.
Запусти приложение:
mvn spring-boot:run.
Теперь протестируй в инструменте вроде GraphiQL (встроен в Spring GraphQL, доступен по /graphiql).
Пример запроса:
graphqlquery {
bookById(id: 1) {
title
author {
name
}
}
}
Сервер вернёт:
json{
"data": {
"bookById": {
"title": "Война и мир",
"author": {
"name": "Лев Толстой"
}
}
}
}
Только то, что запрошено! Если нужно мутации (изменения данных), добавь type Mutation в схему и резолверы для createBook и т.д.
Продвинутые советы для опытных
Обработка ошибок: Используй GraphQLError для кастомных сообщений.
Производительность: Добавь DataLoader для batch-запросов, чтобы избежать N+1 проблемы (когда для списка из N элементов делается N запросов в базу).
Безопасность: Включи аутентификацию с Spring Security, ограничи поля по ролям.
Интеграция с другими сервисами: GraphQL может агрегировать данные из микросервисов.
Пример с DataLoader для оптимизации:
Сначала добавь зависимость graphql-java-tools.
Затем в конфигурации:
@Bean
public DataLoaderRegistry dataLoaderRegistry(BookRepository bookRepo) {
DataLoaderRegistry registry = new DataLoaderRegistry();
registry.register("authorLoader", DataLoader.newDataLoader((List<Long> authorIds) ->
CompletableFuture.supplyAsync(() -> bookRepo.findAuthorsByIds(authorIds)))); // Batch-запрос
return registry;
}
В резолвере используй контекст для загрузки.
Это делает систему масштабируемой.
#Java #middle #on_request #GraphQL
🔥3👍1
Предлагаем темы для разбора и публикации! 📖
В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.
Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.
Примерные правила:
🟢 темы, не выше уровня middle, чтоб был интерес общим.
🟢 Один человек - одна тема.
🟢 Тема должна быть отдельным теоретически-практическим вопросом. Готовый проект - это не тема!
Активнее народ! Неужто ничего не интересно?
Жду Ваших предложений!👏
В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.
Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.
Примерные правила:
Активнее народ! Неужто ничего не интересно?
Жду Ваших предложений!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Выбираем темы для рассмотрения в следующие выходные! 🤨
Anonymous Poll
35%
AOP
46%
Введение в gRPC
19%
Введение в Camunda
👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2