Java библиотека
30.7K subscribers
2.17K photos
86 videos
11 files
2.15K links
Книги, статьи, мемы и многое другое для Java программиста!

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

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

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

Сообщество VK https://vk.com/javatutorial
Download Telegram
Forwarded from Java Guru 🤓
У вас есть два бина с одинаковым интерфейсом. При попытке внедрить зависимость через интерфейс в другой класс Spring выбрасывает исключение о неоднозначности бинов. Какой способ НЕ поможет решить эту проблему?
Anonymous Quiz
15%
Использовать аннотацию @Qualifier при внедрении зависимости
46%
Добавить аннотацию @Autowired(required = false) к полю
27%
Назвать параметр конструктора точно так же, как называется нужный бин
4%
Посмотреть ответ
👍21🔥1
➡️ Автотесты интерфейса и API часто живут в разных наборах инструментов, усложняя настройку и сопровождение.

Playwright позволяет объединить эти проверки и сократить количество лишних зависимостей в проекте.

📆 3 сентября в 20:00 МСК на открытом уроке «UI и API тестирование с Java и Playwright» разберём:
устройство Playwright,
сравним его с Selenium
напишем первые автотесты на Java.

Вы научитесь:
🟥запускать проверки пользовательского интерфейса и API,
🟥структурировать код,
🟥подключать тесты к конвейеру непрерывной интеграции и доставки.
Также вы получите критерии, которые помогут оценить целесообразность перехода на Playwright в рабочем проекте.

Занятие проходит в преддверии старта курса «Автоматизатор тестирования на Java. Продвинутый уровень».

✔️ Зарегистрируйтесь, чтобы освоить Playwright на практике и расширить набор инструментов автоматизации: https://vk.cc/d0OA0X

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
Знаете, что в Java switch можно использовать как выражение, а не только как отдельный блок кода?

Раньше для выбора значения часто писали так:
int timeout;

switch (env) {
case "dev":
timeout = 5;
break;
case "test":
timeout = 10;
break;
case "prod":
timeout = 30;
break;
default:
throw new IllegalArgumentException(env);
}

Работает, но кода много, и легко забыть break.

В современном Java можно записать это короче:
int timeout = switch (env) {
case "dev" -> 5;
case "test" -> 10;
case "prod" -> 30;
default -> throw new IllegalArgumentException(env);
};


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

Если логика в ветке сложнее, можно использовать yield:
int price = switch (type) {
case "vip" -> {
int discount = 20;
yield basePrice - discount;
}
default -> basePrice;
};


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

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥32
Forwarded from Java Guru 🤓
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Вопрос с собеседования

Почему в Java интерфейс может иметь методы с реализацией (default)? Это не противоречит идее интерфейса?

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

Без default при добавлении нового метода пришлось бы менять весь существующий код. С default-методом интерфейс даёт базовую реализацию метода, которую необязательно переопределять в реализующих классах.


Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥321
🔥 Одна аннотация, которая экономит тонны кода в Spring

@RestController - это не просто удобство, а скрытая магия, про которую многие забывают.

Под капотом это комбинация @Controller + @ResponseBody .

То есть тебе не нужно писать @ResponseBody в каждом методе - всё работает автоматически.

• Меньше бойлерплейта
• чище код
• меньше шансов забыть и получить неожиданный результат

Кажется мелочью, но на больших проектах это реально экономит время и нервы

Если до сих пор используешь @Controller + @ResponseBody вручную - пора упрощать

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🔥1
Forwarded from Java News
10 техник оптимизации Java, которые выведут вас на новый уровень

Когда Java-приложение внезапно начинает «подвисать», причина почти всегда кроется в прозаичных деталях: неоптимизированных циклах, неудачном выборе коллекций, забытом кэше или агрессивном GC. В этой статье — 10 практических техник, которые помогут выжать максимум из JVM без преждевременной микрооптимизации и шаманства. Только доказавшие свою эффективность подходы, которые реально работают в проде — от финтеха до высоконагруженных API.

Читать статью


Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2🔥1
Как подключить Keycloak к Spring Boot проекту

Keycloak — это современный open-source Identity Provider от Red Hat, который часто используется в enterprise-проектах для SSO (Single Sign-On), OAuth2 и OpenID Connect. Ниже пошаговая настройка интеграции Keycloak с Spring Boot 3 и Spring Security 6.

1️⃣ Зависимости

Проверь, что в проекте есть или добавь следующие зависимости:

— Spring Web
— Spring Security
— OAuth2 Resource Server
— OAuth2 Client

2️⃣ Разворачиваем Keycloak

Запусти Keycloak через Docker:
docker run -d \
-p 8080:8080 \
-e KEYCLOAK_ADMIN=admin \
-e KEYCLOAK_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:25.0.2 start-dev


После запуска открой http://localhost:8080, войди под admin/admin и создай realm, например demo-realm.

3️⃣ Настройка клиента в Keycloak

В разделе Clients → Create client укажи:

— Client ID: spring-client
— Client Protocol: openid-connect
— Root URL: http://localhost:8081

В разделе Settings:

— Установи Access Type → confidential
— Включи Standard Flow Enabled
— Укажи Redirect URI: http://localhost:8081/login/oauth2/code/keycloak

Сохрани и перейди на вкладку Credentials, скопируй Client Secret.

4️⃣ Настройка application.yml

server:
port: 8081

spring:
security:
oauth2:
client:
registration:
keycloak:
client-id: spring-client
client-secret: YOUR_CLIENT_SECRET
scope: openid, profile, email
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
provider:
keycloak:
issuer-uri: http://localhost:8080/realms/demo-realm


5️⃣ Конфигурация безопасности

Настрой SecurityConfig.java:

@Configuration
public class SecurityConfig {

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/public").permitAll()
.anyRequest().authenticated()
)
.oauth2Login(Customizer.withDefaults())
.logout(logout -> logout
.logoutSuccessUrl("/")
.invalidateHttpSession(true)
);
return http.build();
}
}


🧠 Зачем это нужно

Keycloak снимает головную боль по хранению паролей, управлению ролями и сессиями. Он интегрируется с LDAP, AD, SAML и десятками внешних OAuth-провайдеров.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍65🔥4
💻Хотите понять, как PostgreSQL 18 ускоряет дисковый I/O до 3× и что это даёт на практике?

1 сентября в 20:00 МСК разберём асинхронный I/O и io_uring: от архитектуры до живого бенчмарка. На уроке покажем, как работал синхронный I/O раньше, объясним новую подсистему AIO с параметром io_method и роль effective_io_concurrency, запустим один и тот же тяжёлый запрос на sync vs io_uring — увидите разницу в реальном времени.

Урок полезен DBA, SRE, разработчикам highload-систем и тем, кто планирует миграцию на PG 18 — получите понимание, как настроить io_method под свой профиль нагрузки и замерять эффект на своих данных.

Открытый урок пройдёт в преддверии старта курса «PostgreSQL для администраторов баз данных и разработчиков». Зарегистрируйтесь, чтобы увидеть возможности PG 18 вживую: https://vk.cc/d13NpT

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🔥2👍1
Почему изменяемый ключ в HashMap может сломать поиск?

HashMap ищет значение не просто по содержимому объекта. Сначала он использует hashCode ключа, чтобы выбрать внутреннюю корзину, а потом уже сравнивает ключи через equals.

Представим ключ, где hashCode зависит от поля name:
class UserKey {
String name;

UserKey(String name) {
this.name = name;
}
}


Если такой объект положить в map, всё выглядит нормально:
var key = new UserKey("alice");
map.put(key, "admin");


Проблема начинается, если после вставки изменить поле, участвующее в equals или hashCode.

Например так:
key.name = "bob";

System.out.println(map.get(key));


Теперь объект физически лежит в той корзине, которая была рассчитана для alice. Но при поиске HashMap уже считает хеш для bob и идёт искать в другое место.

Из-за этого даже containsKey может вернуть false:
System.out.println(map.containsKey(key));


Это выглядит очень странно, потому что ссылка на объект осталась той же. Но для HashMap важна стабильность equals и hashCode на всё время, пока объект используется как ключ.

Надёжнее делать ключ неизменяемым:
record UserKey(String name) {}


Если нужен обычный класс, поля ключа лучше сделать final и не давать сеттеры. Тогда объект не сможет поменять свой hashCode после добавления в map.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥31
🔴 Завтра тестовое собеседование с Java-разработчиком

2 сентября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Сергею

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2🔥1
Java-совет : можно использовать List.of() и Set.of() для создания неизменяемых коллекций.

✔️ Это быстрый способ создать немодифицируемые списки и множества без использования Collections.unmodifiableList().

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥511
Вопрос с собеседования

Что делает метод clone()?

Ответ: clone() создаёт копию объекта. Реализация по умолчанию делает поверхностное копирование: примитивы копируются, а ссылки на вложенные объекты остаются теми же. Чтобы clone() работал, класс обязан реализовывать Cloneable, иначе будет ошибка CloneNotSupportedException.

Метод обычно переопределяют, чтобы настроить логику копирования или сделать копию глубже. При этом стандартно вызывают super.clone() и дальше вручную дублируют необходимые поля.

Использование clone() считается не самым удобным способом копирования объектов, поэтому в реальных проектах чаще применяют конструкторы копирования или фабричные методы.


Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
Spring Boot может уронить API из-за одного лишнего поля в JSON

Классика: приходит запрос с дополнительным полем, которого нет в DTO и ты ловишь UnrecognizedPropertyException. Клиент добавил поле, ты не обновил модель - всё падает.

Решение в одну строку:


@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDTO {
private String name;
private int age;
}



Теперь Jackson просто игнорирует лишние поля вместо того, чтобы ломать приложение.

Полезно, когда API живёт долго, клиенты обновляются быстрее бэка, а ломать совместимость нельзя.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥51
ХОЧЕШЬ ПОВЫСИТЬ ГРЕЙД В 2026 ГОДУ? 🚀

Чтобы стать Senior Java разработчиком сегодня, нужно не только знать язык программирования и фреймворки. Нужно уметь строить гибкую архитектуру приложения, которую легко тестировать и менять под задачи бизнеса. Стань экспертом в построении гибкой архитектуры приложения!

👉 Стартуем 8 сентября.

Курс ведет действующий архитектор и Principal Engineer Кирилл Ветчинкин.

Ты научишься:
Разбивать приложение на слои в соответствии с Clean Architecture
Формировать Domain Model и применять тактические паттерны DDD
Реализовывать Use Case как Command/Query
Делать синхронные и асинхронные интеграции, не загрязняя ядро приложения
Писать 3 вида тестов для разных слоев приложения

Полная программа ТУТ 👉 https://microarch.ru/courses/ddd/languages/java?utm_source=posev&utm_medium=erid:2Vtzqw26yVM&utm_campaign=2

А главное — ты с нуля разработаешь и запустишь микросервис, который максимально приближен к реальности "Диспетчеризация заказов на курьеров". Это будет крутым проектом в портфолио или основой для рабочих задач.

А еще:
Проверим все домашки
Поддержим в чате
Проведем живые разборы
Ответим на все вопросы

📕 Сертификат об участии по итогам прохождения курса.

🔥 Не откладывай свой рост на потом: https://microarch.ru/courses/ddd/languages/java?utm_source=posev&utm_medium=erid:2Vtzqw26yVM&utm_campaign=2

Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2Vtzqw26yVM
🔥32👍2
🐳 Магия Docker Compose

Поменяли конфиг одного сервиса и не хотите перезапускать весь стек из 10 контейнеров? docker compose up -d --no-deps service-name пересоздаст только указанный сервис.

🟢Зачем это нужно

— Перезапуск одного сервиса вместо всего стека экономит минуты на тяжёлых проектах.
— --no-deps не трогает зависимости, так что БД и Redis останутся на месте.
— -d запускает в фоне, терминал свободен для другой работы.

🟢Как использовать

— Пересоздать один сервис: docker compose up -d --no-deps api
— Пересобрать и запустить: docker compose up -d --no-deps --build api
— Посмотреть логи только одного: docker compose logs -f api
— Рестарт без пересоздания: docker compose restart api
— Масштабировать: docker compose up -d --scale worker=3

💡 restart не подхватывает изменения в docker-compose.yml или Dockerfile, для этого нужен up -d. Если обновили env-переменные или порты — только up -d применит изменения.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥32
Шифрование текста

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

Исходный текст и ключ (сдвиг):
String text = "hello world";
int shift = 3;


Создаём результат:
StringBuilder result = new StringBuilder();


Проходим по каждому символу:
for (char c : text.toCharArray()) {


Шифруем только буквы:
if (Character.isLetter(c)) {
char base = Character.isLowerCase(c) ? 'a' : 'A';
char enc = (char) ((c - base + shift) % 26 + base);
result.append(enc);
} else {
result.append(c);
}
}


Выводим зашифрованный текст:
System.out.println("Зашифрованный: " + result);


Обратное преобразование (расшифровка):
StringBuilder decoded = new StringBuilder();

for (char c : result.toString().toCharArray()) {
if (Character.isLetter(c)) {
char base = Character.isLowerCase(c) ? 'a' : 'A';
char dec = (char) ((c - base - shift + 26) % 26 + base);
decoded.append(dec);
} else {
decoded.append(c);
}
}


Вывод расшифрованного текста:
System.out.println("Расшифрованный: " + decoded);


После этого легко перейти к более сложным вещам: пароли, хеширование, реальные алгоритмы.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥2
7,2 млн рублей призового фонда и реальные задачи космической отрасли 🚀

В сентябре пройдет серия КосмоХакатонов для студентов, молодых ученых и специалистов.
Участникам предстоит за два дня разработать собственное решение, поработать с экспертами и представить проект жюри.

Участников ждут:
🛰 реальные задачи космической отрасли
👥 команды от 3 до 5 человек
💻 очный и онлайн-форматы
🧑‍💻 работа с экспертами и трекерами
🏆 финал в Москве

Первый КосмоХакатон стартует уже 4 сентября в Ростове-на-Дону.

Дальше серия продолжится в Красноярске, Нижнем Новгороде, Благовещенске и Санкт-Петербурге, а завершится финалом в Москве.

Участие бесплатное. Присоединиться могут студенты, аспиранты, молодые ученые и специалисты от 18 лет.
🔗 Зарегистрироваться: https://космохакатон.рф
👍3🔥2
Совет по Java

Используйте осмысленные имена методов, которые отражают их назначение.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍3🔥1
Вопрос с собеседования

Как и когда происходит увеличение количества корзин в HashMap?

Ответ: У HashMap есть два ключевых параметра: capacity (вместимость — количество корзин) и loadFactor (коэффициент загрузки). Когда количество элементов превышает capacity * loadFactor, происходит расширение: число корзин удваивается, и все записи перераспределяются по новой таблице на основе их хеш-кодов. Это называется рехешированием, и оно необходимо для поддержания эффективности операций.

По умолчанию loadFactor = 0.75, что даёт баланс между использованием памяти и производительностью.


Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥6
Spring Boot может тормозить сам себя из-за одного неаккуратного @ComponentScan

В Spring Boot не стоит бездумно писать что-то вроде:

@ComponentScan("com.mycompany")

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

Это увеличивает время classpath scanning, замедляет старт приложения и иногда подтягивает классы, которые вообще не должны были становиться Spring-компонентами.

Лучший вариант - полагаться на дефолтное поведение:


@SpringBootApplication
public class MyApplication { }



По умолчанию Spring Boot сканирует только подпакеты того пакета, где лежит MyApplication.

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


@ComponentScan({
"com.mycompany.myapp.product",
"com.mycompany.myapp.order"
})



Главная мысль простая: @ComponentScan должен быть точным. Чем шире границы сканирования, тем больше лишней работы делает приложение на старте.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2