Java библиотека
31.5K subscribers
2.37K photos
90 videos
10 files
2.18K links
Книги, статьи, мемы и многое другое для Java программиста!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrT4A

Мы на бирже: https://telega.in/c/javalib/

Сообщество VK https://vk.com/javatutorial
Download Telegram
Forwarded from Java Guru 🤓
Что будет результатом кода?
👍7🔥4
Hot reload секретов под нагрузкой в Java-сервисах на Spring

Привет! На связи Андрей Чернов, Java‑архитектор в СберТехе. В прошлой своей статье я рассказал про особенности работы с секретами в Java‑сервисах на Spring Boot — где их брать и как применять к вашему сервису, на примере того, как мы делаем это в Platform V Sessions Data.

Работа с секретами в современных реалиях, где ни с чем не интегрированных сервисов почти не осталось, очень важна. Она помогает снизить риски утечек и атак, а значит, сохранить деньги, время и репутацию компании. Секретами могу быть, например, сертификаты и учётные данные (имя пользователя, пароль и т. п.).

Как я уже говорил, файлы с секретами по разным причинам меняются, поэтому сервису нужно вовремя реагировать на это и применять новые секреты. В своём сервисе Platform V Sessions Data мы решили применять обновления секретов прямо «на горячую», не останавливая, не перезапуская сервисы, и даже не снимая с них нагрузку. Мы называем это hot reload.


Читать статью
👍53🔥3
📎Паттерн Фасад (Facade)

Фасад — это структурный паттерн, который предоставляет унифицированный интерфейс для работы с набором сложных подсистем. Он скрывает сложность системы и упрощает взаимодействие с ней, предоставляя более простой и понятный API для клиента.

Использование:

🟡 Когда система состоит из множества классов, и нужно упростить доступ к её функционалу.
🟡 Когда нужно предоставить клиенту единый интерфейс для работы с несколькими подсистемами.
🟡 Когда необходимо уменьшить зависимость между клиентом и сложной системой, скрыв внутренние детали реализации.

Преимущества:

1️⃣ Упрощает взаимодействие с комплексной системой, предоставляя удобный интерфейс.
2️⃣ Снижает зависимость клиента от конкретных классов подсистем, облегчая поддержку и тестирование.
3️⃣ Уменьшает количество точек взаимодействия с системой, что помогает избежать ошибок и повысить удобство работы.

Недостатки:

1️⃣ Может скрывать избыточную функциональность, ограничивая возможности системы.
2️⃣ Увеличивает количество кода за счёт добавления нового фасадного класса.
3️⃣ Если фасад слишком абстрактен, может стать сложным для понимания и поддержки.

📌 Паттерн Фасад полезен, когда нужно объединить несколько подсистем под один общий интерфейс, делая систему более удобной и простой для использования. Например, при работе с библиотеками, требующими сложной настройки, или в крупных проектах, где взаимодействие с множеством компонентов может стать запутанным. Фасад помогает улучшить архитектуру и повысить удобство работы с системой.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍156🔥3
🖥Resilience4j — это библиотека для Java, которая предоставляет шаблоны устойчивости, такие как ограничение количества запросов, цепочка перезапусков, схема "предохранитель" (Circuit Breaker), отказоустойчивость и тайм-ауты. Она разработана для повышения стабильности и надежности микросервисов и других распределенных систем, помогая справляться с ошибками и сбоями в вызовах внешних сервисов.

🔍 Основные компоненты Resilience4j:

🌟 Circuit Breaker — схема, которая отслеживает ошибки в зависимости от их частоты и может временно блокировать вызовы к нестабильному сервису.

🌟 Rate Limiter — компонент для контроля частоты запросов и предотвращения перегрузки систем.

🌟 Retry — механизм для повторных вызовов при временных ошибках, позволяющий задать количество попыток и интервалы.

🌟 Bulkhead — ограничение параллельных потоков или разрешенных вызовов для защиты от перегрузки ресурсов.

🌟 TimeLimiter — устанавливает ограничения по времени выполнения, чтобы избежать долгих ожиданий при вызове внешних ресурсов.

🔐 Лицензия: Apache-2.0

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥74😁1
Собеседование на Senior Java разработчика

Провожу собеседование на Senior Java разработчика, разбираем вопросы и ответы. В видео узнаете, что ждут от кандидатов на этом уровне.

📺🗣СМОТРЕТЬ RUTUBE

🌐🗣СМОТРЕТЬ VKVIDEO

📝🗣СМОТРЕТЬ DZEN

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥2😁1
🔼 Roadmap от джуна до сеньора

🟡Инструменты для работы в команде: Освойте Jira, Confluence, Slack, MS Teams, Zoom и другие.
🟡Языки программирования: Углубитесь в 1-2 языка, например, Python, С#.
🟡Разработка API: Изучите REST, GraphQL, gRPC.
🟡Серверы и хостинг: Ознакомьтесь с AWS, Azure, GCP, Kubernetes.
🟡Аутентификация и тестирование: Освойте JWT, OAuth2, TDD и нагрузочное тестирование.
🟡Базы данных: Работайте с SQL (Postgres, MySQL) и NoSQL (MongoDB).
🟡CI/CD: Изучите GitHub Actions, Jenkins.
🟡Алгоритмы: Разберитесь в Big O, деревьях, графах.
🟡Системный дизайн: Погрузитесь в кэширование, микросервисы, балансировку нагрузки.
🟡Паттерны проектирования: Изучите DI, фабрику и другие паттерны.
🟡AI-инструменты: Научитесь использовать GitHub Copilot, ChatGPT.

Какие пункты вы бы ещё добавили?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍236🔥4🎅2
Spring Reactor. Эволюция сервисов. На пути к реактивности

Это статья описывает опыт миграции традиционного приложения java spring на Spring reactor стек. О специфике разрабатываемой информационной системы, уже подробно рассказывал. Кратко о системе - смешанная сервисно-микросервисная архитектура. Чтобы получить бизнес результат, требуется вызвать микросервис, который вызывает сервис, который вызывает набор микросервисов для формирования ценностного набора данных. Получается цепочка вызовов. Сервисы и микросервисы разрабатывались на традиционном технологическом стеке, без использования реактивного подхода.

Читать статью
👍92🔥2
В чем основные различия между checked и unchecked исключениями?

Проверяемые исключения (Checked Exceptions) требуют обработки во время компиляции. Это исключения, которые происходят из класса Exception, но не являются подклассами RuntimeException. Нужно либо обрабатывать такие исключения с помощью try-catch, либо объявлять их в сигнатуре метода с ключевым словом throws. Их цель — предупредить ошибки, которые могут быть предсказаны, но неизбежны, например, проблемы с доступом к файлам.

Непроверяемые исключения (Unchecked Exceptions) включают в себя RuntimeException и его подклассы, такие как NullPointerException, IndexOutOfBoundsException и IllegalArgumentException. Эти исключения происходят во время выполнения и сигнализируют о логических ошибках в коде, которые обычно можно избежать, если правильно построить логику программы. Обработка таких исключений — выбор разработчика, поскольку они не проверяются компилятором и, как правило, возникают из-за ошибок программиста, которые не связаны с внешними условиями.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥64
Forwarded from Java Guru 🤓
Что будет результатом кода?
👍6🔥3
Forwarded from Java Guru 🤓
👍9🔥3
📞 kkTerminal — веб-терминал на Vue.js и Java для удаленного подключения к серверам через SSH! Это инструмент, который можно использовать через браузер, с поддержкой таких возможностей, как:

🌟 Подключение по SSH: Пользователи могут устанавливать соединение с удалёнными серверами, настраивая параметры прямо в интерфейсе.

🌟 Интеграция на веб-сайтах: Подключение возможно через использование тега <iframe> на сторонних веб-страницах.

🌟 Поддержка Docker: Приложение легко разворачивается через Docker-образ, предоставленный автором.

🌟 Управление файлами: Есть функционал просмотра, загрузки, редактирования и управления файлами и папками на удалённом сервере.

🌟 Настройка интерфейса: Можно менять фон, шрифты, размер текста и другие визуальные настройки терминала.

🌟 Работа с горячими клавишами: Поддерживаются операции с файлами с использованием сочетаний клавиш.

🔐 Лицензия: Apache-2.0

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍105🔥31
Никогда не используй CascadeType.ALL вместе с @ManyToMany | Amplicode

Использовать CascadeType.ALL для @ManyToMany не рекомендуется, так как это может привести к непредсказуемым результатам во время удаления JPA сущностей. Вместо этого следует использовать CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST и CascadeType.REFRESH.

🌐🗣СМОТРЕТЬ VKVIDEO

📺🗣СМОТРЕТЬ RUTUBE

📝🗣СМОТРЕТЬ DZEN
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍65
Как работает CopyOnWriteArrayList под капотом?

CopyOnWriteArrayList — это потокобезопасная реализация списка, оптимизированная для сценариев с частым чтением и редкими изменениями. Когда происходит изменение в CopyOnWriteArrayList, создаётся новая копия базового массива, в которую вносятся изменения. Таким образом, чтение и запись изолированы: до завершения модификации читающие потоки получают доступ к старому массиву, а запись завершает свою работу, не блокируя других потоков.

💡 Основные механизмы:

🟡 До завершения операции модификации все читающие потоки продолжают работать с текущей неизменяемой версией массива.
🟡 При вызове методов, изменяющих список (например, add, remove), создаётся новый массив на основе старого. Изменения применяются именно к новому массиву.
🟡 После завершения модификации ссылка на массив обновляется на новую версию. Теперь все новые операции чтения будут работать с обновлённой версией.

⚠️ Особенности:

🟢 Высокие накладные расходы на запись из-за создания копий.
🟢 Подходит для случаев, где чтение доминирует над изменением.
🟢 Не рекомендуется для сценариев с частыми обновлениями из-за увеличения потребления памяти.

CopyOnWriteArrayList идеально подходит для кешей, обработчиков событий и других структур данных, где важна стабильность чтения при редких изменениях.

Документация

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍179🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
🖥Интерактивный roadMap для Java-разработчиков!

Это наглядная дорожная карта для изучения java в 2025 году!

Java библиотека #junior #java #roadmap
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥73😁1🎄1
Паттерн Посетитель (Visitor)

Visitor — это поведенческий паттерн, который позволяет добавлять новые операции к объектам без изменения их классов. Он выделяет операции в отдельный объект, называемый "посетитель", что позволяет избежать дублирования кода и поддерживать open/closed архитектуру.

Использование:

🟡Когда нужно добавлять новые операции к иерархии классов без изменения их структуры.
🟡Когда объектам требуется обработка, зависящая от их типов, но нежелательно добавлять логику внутрь самих классов.

Преимущества:

1️⃣ Упрощает добавление новых операций.
2️⃣ Логика работы концентрируется в одном месте, а не размазывается по классам.
3️⃣ Сохраняется открытость к изменениям операций и закрытость классов к модификациям.

Недостатки:


1️⃣ Увеличивает количество классов.
2️⃣ Добавление нового типа в иерархию требует обновления всех существующих посетителей.
3️⃣ Работает лучше всего с фиксированной иерархией.

📌 Visitor идеально подходит для сценариев, где требуется частое добавление новых операций при сохранении стабильности классов.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍217🔥4🎉2
Контейнеризация Spring Boot приложений | Оптимальный Docker Image | Amplicode

Оптимальный образ для Spring Boot приложения даёт множество преимуществ, среди которых можно отметить:

меньший размер финального образа (из-за исключения инструментов сборки и использования JRE вместо JDK);
🛡 более безопасный подход к работе с файловой системой (за счёт создания и использования пользователя с ограниченными правами);
🚀 ускоренный процесс сборки (благодаря кэшированию зависимостей).

Amplicode позволяет сгенерировать такой образ за пару кликов!

🌐🗣СМОТРЕТЬ VKVIDEO

📺🗣СМОТРЕТЬ RUTUBE

📝🗣СМОТРЕТЬ DZEN
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143🔥21
🖥Cardano Client Library — библиотека для взаимодействия с блокчейном Cardano на языке Java!

🌟 Она упрощает интеграцию приложений с сетью Cardano, предлагая API для работы с транзакциями, адресами, смарт-контрактами, токенами и другими функциями Cardano. Библиотека поддерживает как основной блокчейн, так и второй слой для масштабируемости — Cardano Hydra.

🌟 Эта библиотека ориентирована на разработчиков, желающих создавать приложения, интегрированные с экосистемой Cardano, без необходимости глубоко разбираться в технических деталях протокола. Она также может использоваться для разработки децентрализованных приложений (dApps) и различных инструментов для управления активами в блокчейне Cardano.

🔐 Лицензия: MIT

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍103🔥2
Как устроен под капотом LinkedHashSet?

LinkedHashSet — это коллекция, обеспечивающая хранение уникальных элементов с сохранением порядка их вставки. LinkedHashSet, как и HashSet, работает с элементами за амортизированное O(1) время, но, в отличие от HashSet, сохраняет порядок добавления элементов благодаря дополнительной структуре связного списка.

🟡Структура LinkedHashSet

LinkedHashSet базируется на HashMap, но имеет уникальную особенность — упорядочивание элементов за счёт использования связного списка поверх стандартной хеш-таблицы.

🟢Хранение данных: LinkedHashSet использует LinkedHashMap для хранения элементов. Каждый добавляемый элемент выступает в роли ключа, а значение всегда фиксировано (обычно это объект-заглушка).
🟢Связный список: Для поддержания порядка добавления, элементы связаны друг с другом в виде двусвязного списка. Это позволяет итерациям проходить элементы в порядке их вставки.
🟢Уникальность элементов: Как и в HashSet, каждый элемент уникален. При попытке добавить дублирующий элемент он игнорируется, сохраняя уникальность всех значений.

🟡Производительность

🟢 Добавление: Добавление элементов происходит за амортизированное O(1) время. LinkedHashSet вычисляет хэш элемента и индекс, где он будет храниться в массиве бакетов LinkedHashMap.
🟢Удаление: Удаление происходит также за амортизированное O(1) время. LinkedHashSet находит элемент по хэшу, удаляет его из связного списка и освобождает место в корзине.
🟢Поиск: Поиск происходит за амортизированное O(1) время благодаря хэш-таблице.

🟡Использование памяти

LinkedHashSet требует немного больше памяти по сравнению с HashSet, так как хранит не только хэш-таблицу, но и двусвязный список, поддерживающий порядок добавления элементов. Это делает LinkedHashSet более затратным в плане памяти, особенно при большом количестве элементов.

🟡Преимущества и недостатки

🟢Преимущества:
- Сохранение порядка добавления элементов.
- Быстрая работа с элементами за амортизированное O(1) время, как и в HashSet.

🟢Недостатки:
- Потребление ресурсов возрастает при большом количестве элементов, так как структура требует больше памяти для поддержания порядка.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143🔥2
🖥Xpipe — это кроссплатформенное решение для интеграции данных, ориентированное на простоту настройки и использования!

🌟 Оно позволяет подключать и синхронизировать данные между различными системами и форматами, такими как базы данных, файловые системы и API. Xpipe предоставляет графический интерфейс для настройки потоков данных, что делает его доступным для пользователей без глубоких технических знаний.

🔐 Лицензия: Apache-2.0

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3
Что такое BeanPostProcessor в Spring?

BeanPostProcessor — это интерфейс из Spring Framework, который позволяет вмешиваться в процесс создания и инициализации бинов в Spring контейнере. Он предоставляет два основных метода, которые вызываются на разных этапах жизненного цикла бина:

🟡 postProcessBeforeInitialization(Object bean, String beanName) - вызывается до того, как бин будет инициализирован (до вызова метода @PostConstruct или InitializingBean#afterPropertiesSet).
🟡 postProcessAfterInitialization(Object bean, String beanName) - вызывается после инициализации бина (после завершения всех инициализационных методов).

Зачем нужен BeanPostProcessor?

Он используется для дополнительной обработки и кастомизации бинов после их создания, но до передачи клиентскому коду. Примеры:

- Добавление проксирования бинов (например, для AOP или транзакций).
- Валидация или изменение свойств бинов.
- Логирование жизненного цикла.
- Добавление кастомных аннотаций.
- Обработка маркерных интерфейсов.

Как это работает?

1️⃣ Spring сканирует контекст на наличие бинов, реализующих интерфейс BeanPostProcessor.
2️⃣ Если такие бины найдены, они применяются ко всем бинам в приложении.
3️⃣ Методы postProcessBeforeInitialization и postProcessAfterInitialization вызываются для каждого бина, который создаёт Spring.

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("Before Initialization: " + beanName);
return bean;
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("After Initialization: " + beanName);
return bean;
}
}

Результат: Вывод сообщений о каждом бине до и после инициализации.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍144🔥2