Коллекция диаграмм по софту и программированию от ByteByteGo
✓ Архитектуры и системный дизайн
✓ Объяснение API: REST, SOAP, gRPC, WebSockets
✓ Понимание Git, CI/CD, HTTP и не только
→ https://github.com/ByteByteGoHq/system-design-101
Идеально для подготовки к техническим интервью😳
👉 Java Portal
✓ Архитектуры и системный дизайн
✓ Объяснение API: REST, SOAP, gRPC, WebSockets
✓ Понимание Git, CI/CD, HTTP и не только
→ https://github.com/ByteByteGoHq/system-design-101
Идеально для подготовки к техническим интервью
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3
Что такое Fat JAR в Java?
Fat JAR (он же Uber JAR) — это единый исполняемый .jar-файл, который содержит как классы вашего приложения, так и все его зависимости.
Такое приложение полностью самодостаточно — не нужно отдельно подключать внешние библиотеки во время выполнения.
Просто запускается командой:
Зачем использовать Fat JAR?
🔹 Портируемость — удобно распространять и развёртывать
🔹 Простота — не нужно возиться с classpath и отлавливать ClassNotFoundException
🔹 Отлично подходит для микросервисов и Docker — один артефакт, одна команда запуска
Как собрать Fat JAR
👉 С помощью Maven (maven-assembly-plugin)
Добавьте в pom.xml:
Соберите:
Готовый JAR будет лежать в:
👉 С помощью Maven (maven-shade-plugin)
Если нужен контроль над пересборкой пакетов и теневыми зависимостями — используйте Shade:
Сборка аналогично — итоговый файл будет в:
👉 С помощью Gradle
В
Запуск сборки:
Пример: Минимальное Java-приложение
// 5 фото
С учётом вышеописанных конфигураций Maven или Gradle, все зависимости будут включены в .jar — достаточно java -jar.
Некоторые команды не используют fat JAR для крупных приложений, чтобы:
> Ускорить сборку
> Снизить использование диска
> Упростить обновление отдельных зависимостей без пересборки всего артефакта
Fat JAR упаковывает всё необходимое для простого и портируемого деплоя Java-приложений
Собирается через Maven (плагины assembly или shade) или Gradle
Альтернативы: thin JAR, WAR/EAR, Spring Boot plugin, контейнеры
Выбирайте fat JAR, если важны простота и переносимость, особенно в микросервисной архитектуре и для деплоя в облаке.
👉 Java Portal
Fat JAR (он же Uber JAR) — это единый исполняемый .jar-файл, который содержит как классы вашего приложения, так и все его зависимости.
Такое приложение полностью самодостаточно — не нужно отдельно подключать внешние библиотеки во время выполнения.
Просто запускается командой:
java -jar myapp-fat.jar
Зачем использовать Fat JAR?
Как собрать Fat JAR
Добавьте в pom.xml:
<!-- пример конфигурации (на 2 фото) -->
Соберите:
mvn clean package
Готовый JAR будет лежать в:
target/myapp-jar-with-dependencies.jar
Если нужен контроль над пересборкой пакетов и теневыми зависимостями — используйте Shade:
<!-- пример конфигурации на 3 фото -->
Сборка аналогично — итоговый файл будет в:
target/myapp-shaded.jar
В
build.gradle
добавьте:// пример конфигурации на 4 фото
Запуск сборки:
./gradlew fatJar
Пример: Минимальное Java-приложение
// 5 фото
С учётом вышеописанных конфигураций Maven или Gradle, все зависимости будут включены в .jar — достаточно java -jar.
Некоторые команды не используют fat JAR для крупных приложений, чтобы:
> Ускорить сборку
> Снизить использование диска
> Упростить обновление отдельных зависимостей без пересборки всего артефакта
Fat JAR упаковывает всё необходимое для простого и портируемого деплоя Java-приложений
Собирается через Maven (плагины assembly или shade) или Gradle
Альтернативы: thin JAR, WAR/EAR, Spring Boot plugin, контейнеры
Выбирайте fat JAR, если важны простота и переносимость, особенно в микросервисной архитектуре и для деплоя в облаке.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4❤2
Зачем использовать `
- Включение или отключение бинов и конфигураций на основе значений в `application.properties` без изменения кода
- Загрузка разных бинов для разных сред с помощью конфигурационных параметров
- Исключение лишних бинов снижает потребление памяти и упрощает логику
🔸 Включить бин, если свойство существует:
Используется аннотация
Бин будет создан, если свойство my.prop существует и его значение не "false".
🔸 Включить бин, если свойство равно определённому значению:
Добавляется параметр
Бин будет создан только в том случае, если значение свойства строго равно "yes".
🔸 Включить бин, если свойство отсутствует:
Используется параметр
Бин будет создан даже в случае, если соответствующее свойство вообще не определено в конфигурации.
🔸 Переключение реализаций в зависимости от значения свойства:
Определяются несколько бинов с разными значениями
Будет создан только тот бин, значение которого соответствует текущему значению свойства.
👉 Java Portal
@ConditionalOnProperty
`?- Включение или отключение бинов и конфигураций на основе значений в `application.properties` без изменения кода
- Загрузка разных бинов для разных сред с помощью конфигурационных параметров
- Исключение лишних бинов снижает потребление памяти и упрощает логику
Используется аннотация
@ConditionalOnProperty(name="my.prop")
.Бин будет создан, если свойство my.prop существует и его значение не "false".
Добавляется параметр
havingValue="yes"
.Бин будет создан только в том случае, если значение свойства строго равно "yes".
Используется параметр
matchIfMissing=true
.Бин будет создан даже в случае, если соответствующее свойство вообще не определено в конфигурации.
Определяются несколько бинов с разными значениями
havingValue
.Будет создан только тот бин, значение которого соответствует текущему значению свойства.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍4
Spring Boot Actuator это мощный набор инструментов в составе Spring Boot, который помогает мониторить и управлять приложением в продакшене. Он предоставляет доступ к различным endpoint'ам, через которые можно получить информацию о внутреннем состоянии приложения - метрики, окружение, дампы потоков и т.д.
Что даёт Actuator:
- статус, метрики, окружение и прочее
- Поддержка мониторинга и управления через HTTP, JMX или кастомные endpoint'ы
- Повышенная наблюдаемость, особенно в связке с Prometheus, Grafana, Micrometer или Spring Boot Admin
Часто используемые endpoint'ы:
🔸 /actuator/health
Показывает статус работоспособности приложения
Доступ по умолчанию: Public
🔸 /actuator/info
Выводит информацию из
Доступ по умолчанию: Public
🔸 /actuator/metrics
Показывает различные метрики производительности
Доступ по умолчанию: Restricted
🔸 /actuator/env
Показывает переменные окружения
Доступ по умолчанию: Restricted
🔸 /actuator/beans
Показывает все Spring Beans
Доступ по умолчанию: Restricted
🔸 /actuator/threaddump
Дамп потоков приложения
Доступ по умолчанию: Restricted
🔸 /actuator/loggers
Просмотр или изменение уровней логирования на лету
Доступ по умолчанию: Restricted
🔸 /actuator/heapdump
Скачивание heap dump
Доступ по умолчанию: Restricted
🔸 /actuator/prometheus
Метрики в формате Prometheus (если подключён micrometer-registry-prometheus)
Доступ по умолчанию: Public
👉 Java Portal
Что даёт Actuator:
- статус, метрики, окружение и прочее
- Поддержка мониторинга и управления через HTTP, JMX или кастомные endpoint'ы
- Повышенная наблюдаемость, особенно в связке с Prometheus, Grafana, Micrometer или Spring Boot Admin
Часто используемые endpoint'ы:
Показывает статус работоспособности приложения
Доступ по умолчанию: Public
Выводит информацию из
application.properties
Доступ по умолчанию: Public
Показывает различные метрики производительности
Доступ по умолчанию: Restricted
Показывает переменные окружения
Доступ по умолчанию: Restricted
Показывает все Spring Beans
Доступ по умолчанию: Restricted
Дамп потоков приложения
Доступ по умолчанию: Restricted
Просмотр или изменение уровней логирования на лету
Доступ по умолчанию: Restricted
Скачивание heap dump
Доступ по умолчанию: Restricted
Метрики в формате Prometheus (если подключён micrometer-registry-prometheus)
Доступ по умолчанию: Public
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
Лучшие практики для микросервисов
1. Отдельное хранилище данных
🔸 Каждый микросервис должен использовать свою собственную базу данных, чтобы обеспечить изоляцию данных и слабую связанность.
2. Единый уровень зрелости кода
🔸 Старайтесь поддерживать код всех сервисов примерно на одинаковом уровне зрелости (тестируемость, покрытие, качество).
3. Отдельная сборка для каждого микросервиса
🔸 У каждого сервиса должна быть своя сборочная цепочка (CI/CD pipeline), чтобы обеспечить независимость деплоя.
4. Принцип единственной ответственности
🔸 Один сервис — одна бизнес-задача. Не смешивайте домены и обязанности в рамках одного микросервиса.
5. Развёртывание в контейнерах
🔸 Используйте контейнеры (например, Docker) для упаковки и запуска каждого микросервиса независимо.
6. Обрабатывайте серверы как статeless
🔸 Сервисы не должны хранить состояние между запросами. Состояние — либо в БД, либо во внешнем хранилище.
7. Domain-Driven Design (DDD)
🔸 Стройте архитектуру на основе бизнес-домена: делите систему на логически обоснованные сервисы, а не технические модули.
8. Микрофронтенд
🔸 Разделяйте frontend-приложения по тому же принципу, что и backend: независимые фронты взаимодействуют через API Gateway.
9. Оркестрация микросервисов
🔸 Используйте системы оркестрации (например, Kubernetes), чтобы управлять масштабированием, деплоем и связью между сервисами.
👉 Java Portal
1. Отдельное хранилище данных
2. Единый уровень зрелости кода
3. Отдельная сборка для каждого микросервиса
4. Принцип единственной ответственности
5. Развёртывание в контейнерах
6. Обрабатывайте серверы как статeless
7. Domain-Driven Design (DDD)
8. Микрофронтенд
9. Оркестрация микросервисов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2🔥2
Проект на Spring Boot + Spring AI + OpenAI.
Он принимает текст или файл с заметками встречи и автоматически генерирует JSON-тикеты с классификацией (баг, фича и т.д.).
Теперь в open source: чистый код и готовность к импорту в JIRA.
GitHub: https://github.com/ayushstwt/smart-ticket-ai.git
👉 Java Portal
Он принимает текст или файл с заметками встречи и автоматически генерирует JSON-тикеты с классификацией (баг, фича и т.д.).
Теперь в open source: чистый код и готовность к импорту в JIRA.
GitHub: https://github.com/ayushstwt/smart-ticket-ai.git
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
Algorithmic Thinking Patterns
🔸 Паттерн: Two Pointers
Суть идеи: Ввести два индекса и двигать их по массиву
Когда использовать: Отсортированные массивы, удаление дубликатов, реверс
Типовые задачи: Reverse array in-place, 3Sum, Remove Duplicates
🔸 Паттерн: Sliding Window
Суть идеи: Оптимизация задач на подмассивы путём расширения/сжатия окна
Когда использовать: Строки, макс/мин в окне, шаблоны фиксированной длины
Типовые задачи: Longest substring w/o repeats, Max sum of k-size subarray
🔸 Паттерн: Binary Search on Answer
Суть идеи: Вместо поиска элемента ищем min/max значение, удовлетворяющее условию
Когда использовать: Монотонное пространство поиска
Типовые задачи: Min eating speed, Aggressive cows, Capacity to ship packages
🔸 Паттерн: Prefix Sum / Difference Array
Суть идеи: Предобработка для ответов на запросы за O(1)
Когда использовать: Сумма/частота на интервалах, перекрывающиеся диапазоны
Типовые задачи: Subarray sum = K, Difference array for range updates
🔸 Паттерн: Greedy
Суть идеи: Выбираем на каждом шаге локально лучший вариант, надеясь на глобальный оптимум
Когда использовать: Когда выбор можно отсортировать или сравнить
Типовые задачи: Activity selection, Gas Station, Jump Game
🔸 Паттерн: Backtracking
Суть идеи: Перебираем все варианты и откатываемся с неверных путей
Когда использовать: Комбинации, перестановки, ограничения
Типовые задачи: N-Queens, Sudoku Solver, Subset Sum
🔸 Паттерн: Bitmasking
Суть идеи: Используем биты для представления подмножеств или флагов
Когда использовать: Маленькие N (N ≤ 20), переключаем состояния
Типовые задачи: Count set bits, Subset sum, Traveling Salesman
🔸 Паттерн: Union-Find (DSU)
Суть идеи: Эффективно объединяем и находим компоненты
Когда использовать: Связность, обнаружение циклов
Типовые задачи: Number of Provinces, Kruskal's MST, Friend Circles
🔸 Паттерн: Monotonic Stack / Queue
Суть идеи: Поддерживаем монотонно возрастающую или убывающую структуру
Когда использовать: Следующий больше/меньше, максимум по диапазону
Типовые задачи: Daily Temperatures, Largest rectangle in histogram
🔸 Паттерн: Topological Sort
Суть идеи: Линейный порядок задач по зависимостям
Когда использовать: Ацикличные графы (DAG), планирование
Типовые задачи: Course Schedule, Build Order, Alien Dictionary
🔸 Паттерн: Dynamic Programming (Tabulation)
Суть идеи: Итеративное решение снизу вверх с мемоизацией
Когда использовать: Пересекающиеся подзадачи
Типовые задачи: 0/1 Knapsack, Edit Distance, House Robber
🔸 Паттерн: Divide & Conquer
Суть идеи: Рекурсивное деление входных данных
Когда использовать: Сортировка, сложные рекурсии
Типовые задачи: Merge Sort, Count Inversions, Median of Two Sorted Arrays
🔸 Паттерн: DFS with Memoization
Суть идеи: Сохраняем уже посчитанные значения, чтобы не вычислять повторно
Когда использовать: DAG, рекурсивное ДП
Типовые задачи: Word Break, Unique Paths III, Longest Increasing Path
🔸 Паттерн: Meet in the Middle
Суть идеи: Делим массив пополам, решаем обе части и объединяем
Когда использовать: N ≤ 40, полный перебор слишком дорог
Типовые задачи: Partition to Equal Sum, K-Sum Variants
🔸 Паттерн: Trie-Based Search
Суть идеи: Деревья префиксов
Когда использовать: Поиск слов, автодополнение
Типовые задачи: Implement Trie, Replace Words, Word Squares
🔸 Паттерн: Segment Tree / BIT
Суть идеи: Эффективные запросы и обновления на диапазонах
Когда использовать: Большие массивы, частые модификации
Типовые задачи: Range sum/min/max, Inversions, Lazy Propagation
🔸 Паттерн: Floyd’s Cycle Detection
Суть идеи: Обнаружение цикла с быстрым и медленным указателями
Когда использовать: Связные списки, конечные автоматы
Типовые задачи: Linked List Cycle, Happy Number
👉 Java Portal
Суть идеи: Ввести два индекса и двигать их по массиву
Когда использовать: Отсортированные массивы, удаление дубликатов, реверс
Типовые задачи: Reverse array in-place, 3Sum, Remove Duplicates
Суть идеи: Оптимизация задач на подмассивы путём расширения/сжатия окна
Когда использовать: Строки, макс/мин в окне, шаблоны фиксированной длины
Типовые задачи: Longest substring w/o repeats, Max sum of k-size subarray
Суть идеи: Вместо поиска элемента ищем min/max значение, удовлетворяющее условию
Когда использовать: Монотонное пространство поиска
Типовые задачи: Min eating speed, Aggressive cows, Capacity to ship packages
Суть идеи: Предобработка для ответов на запросы за O(1)
Когда использовать: Сумма/частота на интервалах, перекрывающиеся диапазоны
Типовые задачи: Subarray sum = K, Difference array for range updates
Суть идеи: Выбираем на каждом шаге локально лучший вариант, надеясь на глобальный оптимум
Когда использовать: Когда выбор можно отсортировать или сравнить
Типовые задачи: Activity selection, Gas Station, Jump Game
Суть идеи: Перебираем все варианты и откатываемся с неверных путей
Когда использовать: Комбинации, перестановки, ограничения
Типовые задачи: N-Queens, Sudoku Solver, Subset Sum
Суть идеи: Используем биты для представления подмножеств или флагов
Когда использовать: Маленькие N (N ≤ 20), переключаем состояния
Типовые задачи: Count set bits, Subset sum, Traveling Salesman
Суть идеи: Эффективно объединяем и находим компоненты
Когда использовать: Связность, обнаружение циклов
Типовые задачи: Number of Provinces, Kruskal's MST, Friend Circles
Суть идеи: Поддерживаем монотонно возрастающую или убывающую структуру
Когда использовать: Следующий больше/меньше, максимум по диапазону
Типовые задачи: Daily Temperatures, Largest rectangle in histogram
Суть идеи: Линейный порядок задач по зависимостям
Когда использовать: Ацикличные графы (DAG), планирование
Типовые задачи: Course Schedule, Build Order, Alien Dictionary
Суть идеи: Итеративное решение снизу вверх с мемоизацией
Когда использовать: Пересекающиеся подзадачи
Типовые задачи: 0/1 Knapsack, Edit Distance, House Robber
Суть идеи: Рекурсивное деление входных данных
Когда использовать: Сортировка, сложные рекурсии
Типовые задачи: Merge Sort, Count Inversions, Median of Two Sorted Arrays
Суть идеи: Сохраняем уже посчитанные значения, чтобы не вычислять повторно
Когда использовать: DAG, рекурсивное ДП
Типовые задачи: Word Break, Unique Paths III, Longest Increasing Path
Суть идеи: Делим массив пополам, решаем обе части и объединяем
Когда использовать: N ≤ 40, полный перебор слишком дорог
Типовые задачи: Partition to Equal Sum, K-Sum Variants
Суть идеи: Деревья префиксов
Когда использовать: Поиск слов, автодополнение
Типовые задачи: Implement Trie, Replace Words, Word Squares
Суть идеи: Эффективные запросы и обновления на диапазонах
Когда использовать: Большие массивы, частые модификации
Типовые задачи: Range sum/min/max, Inversions, Lazy Propagation
Суть идеи: Обнаружение цикла с быстрым и медленным указателями
Когда использовать: Связные списки, конечные автоматы
Типовые задачи: Linked List Cycle, Happy Number
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤3🔥3😁1👀1
Модернизация алгоритмов: От наивного → оптимального
🔸 Two Sum (пара с заданной суммой)
Наивно: O(n²) — двойной цикл
Оптимально: O(n) с использованием HashMap
🔸 Find Duplicate Number (найти дубликат, 1 ≤ num ≤ n)
Наивно: HashSet или дополнительная память
Оптимально: Обнаружение цикла Флойда (O(1) по памяти)
🔸 Kth Largest Element (k-й по величине элемент)
Наивно: Сортировка массива (O(n log n))
Оптимально: QuickSelect (в среднем O(n)) или куча (Heap)
🔸 Longest Palindromic Substring (длиннейшая палиндромная подстрока)
Наивно: O(n³) — перебор всех подстрок
Оптимально: Расширение из центра (Expand Around Center, O(n²)), или алгоритм Манакера (O(n))
🔸 Max Subarray Sum (максимальная сумма подмассива)
Наивно: Генерация всех подмассивов
Оптимально: Алгоритм Кадане (Kadane’s Algorithm, O(n))
🔸 All Pairs Shortest Paths (кратчайшие пути между всеми вершинами)
Наивно: Запускать Dijkstra для каждой вершины
Оптимально: Алгоритм Флойда–Уоршелла (Floyd-Warshall, O(V³)), эффективен для плотных графов
🔸 Median in Data Stream (медиана в потоке данных)
Наивно: Сортировать после каждой вставки
Оптимально: Две кучи (Min Heap и Max Heap), вставка за O(log n)
🔸 Valid Anagram (анаграмма?)
Наивно: Сортировка строк
Оптимально: Подсчёт частот символов в массиве (O(n))
🔸 Permutations (перестановки)
Наивно: Сгенерировать и сохранить все перестановки
Оптимально: Рекурсивный Backtracking с отсечениями
🔸 Subset Sum Exists (проверка, существует ли сумма из подмножества)
Наивно: Перебор всех подмножеств (2ⁿ)
Оптимально: Динамическое программирование — снизу вверх или с мемоизацией
🔸 Product of Array Except Self (произведение всех кроме текущего)
Наивно: Умножать все кроме текущего, O(n²)
Оптимально: Префикс + суффикс произведения (O(n))
🔸 Shortest Unsorted Subarray (самый короткий несортированный подмассив)
Наивно: Сортировка и сравнение
Оптимально: Два указателя для границ (O(n))
🔸 Min Window Substring (минимальная подстрока с нужными символами)
Наивно: Перебор всех подстрок
Оптимально: Sliding Window + HashMap, O(n)
🔸 Search in Rotated Array (поиск в повернутом массиве)
Наивно: Линейный поиск
Оптимально: Модифицированный бинарный поиск
🔸 Count Inversions (подсчёт инверсий)
Наивно: Вложенные циклы, O(n²)
Оптимально: Модифицированный Merge Sort, O(n log n)
🔸 Check if Tree is Balanced (проверка сбалансированности дерева)
Наивно: Пересчитывать высоту на каждом шаге
Оптимально: Один проход — возвращаем высоту и статус баланса
🔸 Merge k Sorted Lists (слияние k отсортированных списков)
Наивно: Объединить всё и отсортировать
Оптимально: Слияние k списков через Min Heap, O(N log k)
🔸 Longest Consecutive Sequence (длиннейшая последовательность чисел)
Наивно: Сортировка и проход
Оптимально: HashSet + сканирование, O(n)
🔸 Word Ladder (преобразование слов)
Наивно: BFS от каждого слова
Оптимально: Предобработка + двусторонний BFS
🔸 Number of Islands (количество островов)
Наивно: DFS без отметок
Оптимально: DFS/BFS/Union-Find с отслеживанием посещённых клеток
👉 Java Portal
Наивно: O(n²) — двойной цикл
Оптимально: O(n) с использованием HashMap
Наивно: HashSet или дополнительная память
Оптимально: Обнаружение цикла Флойда (O(1) по памяти)
Наивно: Сортировка массива (O(n log n))
Оптимально: QuickSelect (в среднем O(n)) или куча (Heap)
Наивно: O(n³) — перебор всех подстрок
Оптимально: Расширение из центра (Expand Around Center, O(n²)), или алгоритм Манакера (O(n))
Наивно: Генерация всех подмассивов
Оптимально: Алгоритм Кадане (Kadane’s Algorithm, O(n))
Наивно: Запускать Dijkstra для каждой вершины
Оптимально: Алгоритм Флойда–Уоршелла (Floyd-Warshall, O(V³)), эффективен для плотных графов
Наивно: Сортировать после каждой вставки
Оптимально: Две кучи (Min Heap и Max Heap), вставка за O(log n)
Наивно: Сортировка строк
Оптимально: Подсчёт частот символов в массиве (O(n))
Наивно: Сгенерировать и сохранить все перестановки
Оптимально: Рекурсивный Backtracking с отсечениями
Наивно: Перебор всех подмножеств (2ⁿ)
Оптимально: Динамическое программирование — снизу вверх или с мемоизацией
Наивно: Умножать все кроме текущего, O(n²)
Оптимально: Префикс + суффикс произведения (O(n))
Наивно: Сортировка и сравнение
Оптимально: Два указателя для границ (O(n))
Наивно: Перебор всех подстрок
Оптимально: Sliding Window + HashMap, O(n)
Наивно: Линейный поиск
Оптимально: Модифицированный бинарный поиск
Наивно: Вложенные циклы, O(n²)
Оптимально: Модифицированный Merge Sort, O(n log n)
Наивно: Пересчитывать высоту на каждом шаге
Оптимально: Один проход — возвращаем высоту и статус баланса
Наивно: Объединить всё и отсортировать
Оптимально: Слияние k списков через Min Heap, O(N log k)
Наивно: Сортировка и проход
Оптимально: HashSet + сканирование, O(n)
Наивно: BFS от каждого слова
Оптимально: Предобработка + двусторонний BFS
Наивно: DFS без отметок
Оптимально: DFS/BFS/Union-Find с отслеживанием посещённых клеток
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥2
Spring Boot + Swagger
Документирование API без лишней головной боли.
Полное руководство читай здесь: тык
👉 Java Portal
Документирование API без лишней головной боли.
Полное руководство читай здесь: тык
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍3
Мини руководство по паттернам проектирования
🔸 Singleton
Реализация: статический экземпляр + приватный конструктор
Пример: логгер, менеджер конфигурации, пул подключений к БД
🔸 Factory
Реализация: метод create(String type) возвращает нужный подкласс
Пример: парсеры файлов (.json, .xml), отправка уведомлений
🔸 Abstract Factory
Реализация: интерфейс для создания связанных объектов без указания их классов
Пример: UI-темы (тёмная/светлая), фабрики виджетов операционной системы
🔸 Builder
Реализация: цепочка вызовов .set() + .build()
Пример: создание сложных объектов, например HTTP-запросов
🔸 Prototype
Реализация: клонирование существующего объекта через .clone()
Пример: игровые персонажи, шаблоны документов, клоны интерфейсов
🔸 Strategy
Реализация: интерфейс + метод setStrategy()
Пример: алгоритмы сортировки, платёжные процессоры
🔸 Observer
Реализация: список подписчиков + цикл notifyAll()
Пример: система событий, UI-слушатели, подписки на YouTube
🔸 Decorator
Реализация: обёртка над объектом + добавление поведения на лету
Пример: логгирование, сжатие, кэширование
🔸 Adapter
Реализация: класс-обёртка, преобразующий интерфейс
Пример: интеграция с легаси API, InputStreamReader
🔸 Facade
Реализация: один класс делегирует вызовы нескольким подсистемам
Пример: java.util.logging, фасад медиаплеера
🔸 Command
Реализация: инкапсуляция действия в объект с методом execute()
Пример: Undo/Redo, обработка нажатий кнопок
🔸 Chain of Responsibility
Реализация: каждый обработчик решает — обработать или передать дальше
Пример: эскалация тикетов в техподдержке, всплытие событий (event bubbling)
🔸 Template Method
Реализация: базовый класс задаёт общий алгоритм, подклассы переопределяют шаги
Пример: обработка онлайн-заказа — оплата → подтверждение → доставка
🔸 State
Реализация: поведение определяется текущим объектом состояния
Пример: состояния медиаплеера — воспроизведение/пауза/стоп
🔸 Mediator
Реализация: центральный объект управляет взаимодействием компонентов
Пример: менеджер чата, валидация форм в UI
🔸 Memento
Реализация: сохранение и восстановление внутреннего состояния объекта
Пример: история изменений, снапшоты состояния в текстовом редакторе
🔸 Visitor
Реализация: внешний класс выполняет операции над элементами структуры
Пример: обход файловой системы, обработка AST
🔸 Proxy
Реализация: обёртка над реальным объектом для контроля доступа или производительности
Пример: ленивая загрузка, контроль доступа, удалённые прокси
🔸 Composite
Реализация: древовидная структура, где элементы и группы обрабатываются одинаково
Пример: иерархия файлов и папок, UI-компоненты
🔸 Flyweight
Реализация: повторное использование объектов с общим внутренним состоянием
Пример: глифы шрифта, иконки интерфейса, текстуры в играх
🔸 Bridge
Реализация: разделение абстракции и реализации
Пример: представление UI → движок отрисовки (SVG, Canvas и т.д.)
👉 Java Portal
Реализация: статический экземпляр + приватный конструктор
Пример: логгер, менеджер конфигурации, пул подключений к БД
Реализация: метод create(String type) возвращает нужный подкласс
Пример: парсеры файлов (.json, .xml), отправка уведомлений
Реализация: интерфейс для создания связанных объектов без указания их классов
Пример: UI-темы (тёмная/светлая), фабрики виджетов операционной системы
Реализация: цепочка вызовов .set() + .build()
Пример: создание сложных объектов, например HTTP-запросов
Реализация: клонирование существующего объекта через .clone()
Пример: игровые персонажи, шаблоны документов, клоны интерфейсов
Реализация: интерфейс + метод setStrategy()
Пример: алгоритмы сортировки, платёжные процессоры
Реализация: список подписчиков + цикл notifyAll()
Пример: система событий, UI-слушатели, подписки на YouTube
Реализация: обёртка над объектом + добавление поведения на лету
Пример: логгирование, сжатие, кэширование
Реализация: класс-обёртка, преобразующий интерфейс
Пример: интеграция с легаси API, InputStreamReader
Реализация: один класс делегирует вызовы нескольким подсистемам
Пример: java.util.logging, фасад медиаплеера
Реализация: инкапсуляция действия в объект с методом execute()
Пример: Undo/Redo, обработка нажатий кнопок
Реализация: каждый обработчик решает — обработать или передать дальше
Пример: эскалация тикетов в техподдержке, всплытие событий (event bubbling)
Реализация: базовый класс задаёт общий алгоритм, подклассы переопределяют шаги
Пример: обработка онлайн-заказа — оплата → подтверждение → доставка
Реализация: поведение определяется текущим объектом состояния
Пример: состояния медиаплеера — воспроизведение/пауза/стоп
Реализация: центральный объект управляет взаимодействием компонентов
Пример: менеджер чата, валидация форм в UI
Реализация: сохранение и восстановление внутреннего состояния объекта
Пример: история изменений, снапшоты состояния в текстовом редакторе
Реализация: внешний класс выполняет операции над элементами структуры
Пример: обход файловой системы, обработка AST
Реализация: обёртка над реальным объектом для контроля доступа или производительности
Пример: ленивая загрузка, контроль доступа, удалённые прокси
Реализация: древовидная структура, где элементы и группы обрабатываются одинаково
Пример: иерархия файлов и папок, UI-компоненты
Реализация: повторное использование объектов с общим внутренним состоянием
Пример: глифы шрифта, иконки интерфейса, текстуры в играх
Реализация: разделение абстракции и реализации
Пример: представление UI → движок отрисовки (SVG, Canvas и т.д.)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Кто не в курсе: Spring Debugger — это инструмент в IntelliJ IDEA, который помогает разбираться в контексте Spring Boot-приложения.
Прямо в проекте можно:
🔸 посмотреть список загруженных и неактивных бинов,
🔸 проверить значения конфигурационных свойств,
🔸 увидеть детали подключения к базе.
Удобно для дебага, особенно когда неясно, почему бин не поднялся или почему конфигурация работает не так, как ожидалось.
👉 Java Portal
Прямо в проекте можно:
Удобно для дебага, особенно когда неясно, почему бин не поднялся или почему конфигурация работает не так, как ожидалось.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12