Java Portal | Программирование
11.9K subscribers
1.64K photos
119 videos
45 files
1.72K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Вы можете использовать @JsonCreator, чтобы обеспечить предсказуемое преобразование JSON в Java-объекты.

✅ Указывает точный конструктор, который должен вызвать Jackson.
✅ @JsonProperty явно связывает каждое поле JSON с соответствующим свойством объекта.
✅ Отлично подходит для неизменяемых (immutable) типов — сеттеры не требуются.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Виртуальные потоки (Java 21) — простое объяснение:

Платформенный поток (Platform Thread) = один поток ОС. Он потребляет много ресурсов. Обычно можно создать тысячи таких потоков.

Виртуальный поток (Virtual Thread) = поток, управляемый JVM. Он гораздо легче, поэтому можно создавать миллионы таких потоков.

Лучше всего подходят для: операций с блокирующим вводом-выводом (I/O), например запросов к БД и HTTP-запросов.

Не решают проблему: ресурсоёмких вычислений (CPU-bound задач).

Главное: простой код и высокая параллельность.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
💡 Виртуальные потоки (Virtual Threads) в Java 21 — лёгкие потоки, управляемые JVM.

✅ Не привязаны к потокам ОС по принципу 1:1, поэтому их можно создавать в огромном количестве.
✅ Создать виртуальный поток можно с помощью Thread.ofVirtual().start(...).
✅ Лучше всего подходят для операций, связанных с ожиданием (I/O). Для ресурсоёмких вычислений по-прежнему лучше использовать пулы потоков.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Паттерны проектирования, которые действительно пригодятся в работе с Java:

- Builder — создание объектов с большим количеством необязательных полей.
- Factory — скрывает логику выбора и создания конкретного класса.
- Strategy — позволяет менять поведение, например использовать разные способы оплаты.
- Singleton — гарантирует наличие одного экземпляра объекта (Spring-бин по умолчанию тоже является Singleton в рамках своего контейнера).
- Observer — работа с событиями и слушателями.
- Adapter — позволяет использовать старый API через новый интерфейс.
- Decorator — добавляет функциональность, не изменяя исходный класс.
- Template Method — задаёт общую последовательность шагов, позволяя менять детали реализации.
Необязательно заучивать все паттерны из книги.

Изучите эти — и вы начнёте замечать их в коде, с которым уже работаете.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
💡 Webhook — это обычный POST-запрос, который ваше приложение получает, когда в другой системе происходит определённое событие.

✅ Создайте endpoint с @PostMapping для получения данных события.
✅ Никакого polling (периодического опроса) — другая система сама отправляет запрос, когда событие происходит.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Изучение внутреннего устройства Git — это одна из топ-5 вещей, которые разработчик может сделать для себя.

Вся суть Git внезапно сводится к коммитам в ветках, и тогда становится видно, насколько Git красив и прост по своей сути.

- rebase — это просто пересоздание коммитов на новой базе
- cherry-pick — это просто повторное применение изменений одного коммита
- merge — это просто соединение историй
- reset — это просто перемещение текущего ref’а

На самом деле это одна из самых красивых систем, когда-либо созданных.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1
Harness Engineering для Java- и Spring Boot-приложений

В статье рассматриваются инструменты и практики для контроля качества и проверки архитектуры приложений:

- Форматирование и проверка кода
- Анализ покрытия кода и качества с помощью JaCoCo и SonarQube
- Проверка архитектуры с помощью ArchUnit и Taikai
- Контроль границ модулей с помощью Spring Modulith
- Анализ работы приложения во время выполнения с помощью BootUI

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Вот почему Сэм Альтман, кстати, ненавидит Java. 🙂

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4
💡 Нужны тестовые данные в базе? Используйте @Sql в Java!

Эта аннотация позволяет запускать SQL-скрипты перед тестами или после их выполнения.

✅ Загружает SQL-скрипты из classpath перед или после каждого тестового метода
✅ Позволяет хранить тестовые данные в отдельных .sql-файлах, не загромождая Java-код
✅ Работает с @SpringBootTest и @DataJpaTest

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🚀 Совет по Spring: @Fallback — альтернативный выбор бина

Аннотация @Fallback позволяет Spring выбрать резервный бин, если доступные бины не имеют статуса @Primary.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
💡 Проверяете индекс массива? Используйте Objects.checkIndex() (Java 9+).

✅ Заменяет ручные проверки if (i < 0 || i >= size)
✅ Выбрасывает IndexOutOfBoundsException с понятным сообщением
✅ Также полезны методы checkFromToIndex() и checkFromIndexSize() для проверки диапазонов

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Хеширование vs шифрование vs кодирование

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

Главный вопрос: что вы хотите сделать — проверить данные, защитить их или просто изменить способ их представления?

Короткая шпаргалка:

• Hashing (хеширование) → преобразование в одну сторону.
• Encryption (шифрование) → обратимое преобразование с помощью ключа.
• Encoding (кодирование) → обратимое преобразование без секретного ключа.

1. Хеширование (Hashing). Хеширование преобразует входные данные в хеш фиксированной длины.

Вход: Hello123
↓
SHA-256
↓
Хеш: 64-символьное шестнадцатеричное значение


Пример на Java:
MessageDigest digest = MessageDigest.getInstance("SHA-256");

byte[] hash = digest.digest(
"Hello123".getBytes(StandardCharsets.UTF_8)
);


Практически невозможно восстановить исходные данные из надёжного криптографического хеша.

Где используется:

• Проверка целостности данных.
• Хранение паролей (с помощью специализированных алгоритмов хеширования паролей).
• Цифровые подписи.
• Проверка файлов.

<text color="warning" weight="medium">⚠️</text> Для хранения паролей следует использовать Argon2id, bcrypt, scrypt или PBKDF2 с подходящими солью и параметрами, а не обычный SHA-256.

Запомните: можно ли проверить данные, не восстанавливая оригинал?

2. Шифрование (Encryption). Шифрование преобразует читаемые данные в зашифрованный текст с помощью криптографического ключа.

Исходный текст
↓
Шифрование + ключ
↓
Шифротекст
↓
Расшифровка + ключ
↓
Исходный текст


Например:
Вход: AccountNumber123
Выход: Зашифрованный текст


С правильным ключом исходные данные можно восстановить.

Где используется:

• Защита конфиденциальных данных.
HTTPS/TLS.
• Шифрование баз данных.
• Безопасная передача информации.
• Защита файлов.

Запомните: данные должны оставаться секретными, но при необходимости их можно восстановить.

3. Кодирование (Encoding). Кодирование преобразует данные в другое представление. Это не механизм обеспечения безопасности.

Вход: Hello
↓
Base64 Encoding
↓
SGVsbG8=
↓
Base64 Decoding
↓
Hello


Пример на Java:
String encoded = Base64.getEncoder()
.encodeToString("Hello".getBytes());

String decoded = new String(
Base64.getDecoder().decode(encoded)
);


Где используется:


• Base64.
• URL-кодирование.
• Форматы сериализации данных.
• Передача бинарных данных в текстовом виде.

Запомните: меняется представление данных, а не уровень их защиты.

Распространённые заблуждения:

• Base64 — это шифрование.
• Хеширование — это шифрование.
• Зашифрованные данные невозможно расшифровать.
• SHA-256 сам по себе подходит для хранения паролей.

Всё это неверно.

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

MySecret123

• Хеширование: сохраняем надёжный хеш пароля и используем его для проверки при входе.
• Шифрование: защищаем данные, которые в дальнейшем потребуется расшифровать.
• Кодирование: преобразуем данные в формат, удобный для передачи.

Главное, что нужно запомнить:

• Hashing → Проверить.
• Encryption → Защитить.
• Encoding → Представить.

Если нужна конфиденциальность — используйте шифрование. Если нужно проверить целостность — хеширование. Если требуется изменить представление данных — кодирование.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
💡 Не отправляйте null-поля в JSON — используйте @JsonInclude(NON_NULL).

✅ Исключает из ответа свойства, значение которых равно null.
✅ Делает JSON чище для клиентов и уменьшает размер ответа.
✅ Аннотацию можно добавить к классу или отдельному полю, а также настроить глобально через Jackson.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Отличная шпаргалка для разработчиков, которые регулярно работают с Git.

Создание коммитов, переключение между ветками, разрешение конфликтов, отмена изменений, работа с удалёнными репозиториями и история проекта.
80 команд с короткими пояснениями и примерами.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Нужен бин только для тестов? Используйте @TestConfiguration.

✅ Позволяет объявлять бины, которые загружаются только в тестах и не попадают в production.
✅ Можно объявить конфигурацию внутри тестового класса или явно подключить её через @Import.
✅ Безопаснее, чем размещать фейковые реализации в src/main.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Аутентификация и авторизация (OAuth, JWT, Sessions)

Что такое аутентификация (Authentication)?

Аутентификация — это процесс проверки личности пользователя или системы. Она подтверждает, что человек или приложение, пытающееся получить доступ к системе, действительно является тем, за кого себя выдаёт.

→ Пример: вход в систему с помощью логина и пароля.
Что такое авторизация (Authorization)?

Авторизация определяет, какие действия может выполнять аутентифицированный пользователь внутри системы. Она задаёт права и уровни доступа.

→ Пример: обычный пользователь может просматривать контент, а администратор — добавлять и удалять его.

OAuth (Open Authorization):

→ Стандартный протокол для делегирования доступа с помощью токенов.
→ Позволяет пользователям входить через сторонних провайдеров, например Google, Facebook или GitHub.
→ Пример: кнопка «Войти через Google» на сайте.

JWT (JSON Web Token):

→ Компактный формат токенов, используемый для передачи данных аутентификации.
→ Содержит закодированную информацию о пользователе и имеет цифровую подпись для проверки целостности.
→ Часто применяется в stateless-аутентификации, когда сервер не хранит данные сессии.
→ Пример: после входа сервер выдаёт JWT, который клиент отправляет с каждым запросом.

Sessions (Сессии):

→ Метод, при котором сервер временно хранит данные об аутентификации пользователя.
→ Идентификатор сессии сохраняется в браузере клиента (обычно в cookie) и связывается с данными на сервере.
→ Пример: классические веб-приложения, в которых пользователь остаётся авторизованным до истечения срока действия сессии или выхода из системы.

Ключевые отличия:

→ OAuth: делегирует доступ внешним провайдерам.
→ JWT: позволяет передавать данные аутентификации в токенах без хранения состояния сессии на сервере.
→ Sessions: используют состояние, храня данные сессии на сервере.

Примеры из реальной разработки:

→ OAuth: вход в Spotify через Facebook или Google.
→ JWT: API, в которых клиенты проходят аутентификацию с помощью токенов.
→ Sessions: классические веб-приложения на PHP или Node.js с системой входа.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Совет по конфигурации Spring Boot:

Не прописывайте значения окружения напрямую в коде.

• application.yml → значения по умолчанию
• application-dev.yml → настройки для dev-окружения
• application-prod.yml → настройки для prod-окружения
• Секреты → переменные окружения или менеджер секретов

Используйте @ConfigurationProperties для типизированной конфигурации вместо того, чтобы повсюду применять @Value.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🤣2