Библиотека Java разработчика
10.8K subscribers
1.14K photos
564 videos
58 files
1.44K links
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.


По всем вопросам @evgenycarter

РКН clck.ru/3KoGeP
Download Telegram
⚡️ Квиз на знание Java

Пройти тестирование — сложно! А ты справишься?
22 вопроса, 30 минут

Проверь себя - пройди квиз и оцени свой уровень навыков, а также свою готовность к обучению на курсе — «Java Developer. Advanced» от Отус.

👩‍💻 На курсе ты научишься профилировать приложения, настраивать GC, работать с реактивными подходами и мониторить метрики в Grafana. Пройдешь весь путь от JVM до Kubernetes, научишься анализировать «горячие точки», оптимизировать приложения и настраивать интеграции с Prometheus.

➡️ ПРОЙТИ ТЕСТ: https://vk.cc/cJDbVm

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Доброе утро, коллеги!

Сегодня я хочу обсудить с вами одну из распространённых проблем, с которыми сталкиваются Java-разработчики, — "ад зависимостей".

Что такое "ад зависимостей"?

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

- Множество зависимостей: Приложение требует загрузки большого числа библиотек, что увеличивает время сборки и объём занимаемого дискового пространства.

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

- Конфликтующие зависимости: Разные библиотеки требуют разные версии одной и той же зависимости, что может привести к несовместимости и ошибкам при выполнении приложения.

Как избежать "ада зависимостей"?

1. Используйте системы управления зависимостями: Инструменты, такие как Maven или Gradle, помогают автоматически управлять зависимостями, разрешать конфликты версий и упрощают процесс сборки проекта.

2. Ограничивайте количество зависимостей: Перед добавлением новой библиотеки задумайтесь, действительно ли она необходима. Возможно, функциональность можно реализовать с помощью уже используемых инструментов или собственными силами.

3. Следите за версиями библиотек: Старайтесь использовать стабильные и проверенные версии зависимостей. Избегайте использования библиотек, которые давно не обновлялись или имеют известные проблемы совместимости.

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

5. Изолируйте зависимости: Если возможно, используйте механизмы модульности (например, Java Modules) для изоляции зависимостей и предотвращения конфликтов между ними.

Заключение

Управление зависимостями — ключевой аспект разработки на Java. Грамотный подход к этому вопросу поможет избежать множества проблем и обеспечит стабильность и надёжность вашего приложения. Делитесь своим опытом и подходами к управлению зависимостями в комментариях!

👉@BookJava
👍5💩4
📌 Как правильно писать equals и hashCode в Java?

Сейчас разберем один из самых частых вопросов у Java-разработчиков: как правильно переопределять equals() и hashCode()?

Эти методы нужны для корректного сравнения объектов и работы коллекций (`HashMap`, HashSet, HashTable и т. д.). Неправильная реализация может привести к неожиданным багам, которые трудно отловить.

Основные правила для equals()
1️⃣ Рефлексивностьx.equals(x) должно всегда возвращать true.
2️⃣ Симметричностьx.equals(y) должно возвращать тот же результат, что и y.equals(x).
3️⃣ Транзитивность – если x.equals(y) и y.equals(z), то x.equals(z).
4️⃣ Стабильность – если объекты не менялись, результат вызова equals() не должен меняться.
5️⃣ Не nullx.equals(null) всегда должен возвращать false.

Пример корректного equals():

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
MyClass myClass = (MyClass) obj;
return Objects.equals(field1, myClass.field1) &&
Objects.equals(field2, myClass.field2);
}


Основные правила для hashCode()
🔹 Если equals() возвращает true, то hashCode() должен быть одинаковым.
🔹 Если equals() возвращает false, то hashCode() может быть одинаковым, но лучше минимизировать коллизии.
🔹 hashCode() должен быть быстрым и эффективно распределять объекты.

Пример hashCode():

@Override
public int hashCode() {
return Objects.hash(field1, field2);
}


Частые ошибки
🚫 Использование == вместо equals() для объектов.
🚫 Неопределенный hashCode(), из-за чего HashMap работает некорректно.
🚫 Изменяемые поля в hashCode() – при изменении объекта он может потеряться в HashMap.

Используйте Objects.equals() и Objects.hash(), чтобы избежать рутины!

📢 Как вы реализуете equals() и hashCode()? Были ли у вас баги из-за их неправильной работы? Делитесь в комментариях!

👉@BookJava
👍83
👩‍💻 Курс «Java-разработчик»: помощь в превращении стажёра в сильного Middle

🔥 Вы платите не только за знания, но и за эффективное карьерное сопровождение. Быстрее найдя работу, вы окупите затраты и начнёте уверенно расти в доходе.

💻 Наше обучение — это живые вебинары с действующими экспертами в области, которые проведут тебя от новичка до уверенного Middle-разработчика. Ты освоишь Spring, Hibernate, PostgreSQL, Docker, Kafka, Kubernetes и другие актуальные технологии!

✔️ Трехступенчатая поддержка до полного трудоустройства
- Мы сопровождаем студента не только в момент обучения и поиска работы, но и в период адаптации после выхода в новую компанию.

✔️ Индивидуальный подход на вебинарах и консультациях
- Мы не выдаем всем «один и тот же скрипт»: во время карьерных вебинаров отвечаем на конкретные вопросы студентов.

✔️ Профессиональное резюме под руководством HR-экспертов
- Подготовка резюме и разбор «точек роста». Эксперт помогает сформулировать сильные стороны, уникальные достижения и убрать «лишнее», чтобы резюме работало на конкретные вакансии.

✔️ Поддержка после оффера
- Даем рекомендации, как вести себя в первые месяцы, какие вопросы задавать руководителю, как справляться со стрессом и «синдромом самозванца». Это особенно важно, когда студент переходит из стажерской/джуниор роли в более серьезную позицию.

Наш партнер — СберКорус, разработчик передовых цифровых решений!

👉 Оставь заявку и получи скидку на курс: https://vk.cc/cJFwz6

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Оптимизация SQL-запросов в Hibernate

Сегодня я хочу поделиться с вами одной из распространённых проблем в Hibernate — N+1 проблема. Если вы используете ORM без оптимизаций, то скорее всего сталкивались с этим.

📌 В чём суть?

Допустим, у нас есть две связанные сущности:

@Entity
public class Author {
@Id @GeneratedValue
private Long id;

private String name;

@OneToMany(mappedBy = "author", fetch = FetchType.LAZY)
private List<Book> books;
}


@Entity
public class Book {
@Id @GeneratedValue
private Long id;

private String title;

@ManyToOne
private Author author;
}


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

List<Author> authors = entityManager.createQuery("SELECT a FROM Author a", Author.class).getResultList();

for (Author author : authors) {
System.out.println(author.getBooks().size());
}


Мы получаем 1 запрос для авторов + N запросов для книг. Это и есть N+1 проблема!

🚀 Как исправить?

Используем JOIN FETCH:

List<Author> authors = entityManager.createQuery(
"SELECT a FROM Author a JOIN FETCH a.books", Author.class).getResultList();


Теперь будет один SQL-запрос вместо кучи мелких.

🔥 Альтернативы:
Entity Graph – даёт гибкость в загрузке связей.
Batch Size в Hibernate – уменьшает количество запросов.
DTO и кастомные запросы – загружаем только нужные данные.

Оптимизация SQL-запросов в ORM — ключ к быстродействию вашего приложения!

👉@BookJava
👍3
Подборка Telegram каналов для программистов

https://t.me/bash_srv Bash Советы
https://t.me/win_sysadmin Системный Администратор Windows
https://t.me/lifeproger Жизнь программиста. Авторский канал.
https://t.me/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://t.me/rabota1C_rus Вакансии для программистов 1С

Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин

https://t.me/linux_odmin Linux: Системный администратор
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux

1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://t.me/DevLab1C 1С:Предприятие 8

Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах

Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus

Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах

GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных

Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin

Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано

Разработка игр 📌
https://t.me/game_devv Все о разработке игр

Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов

БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning

Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста

QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика

Шутки программистов 📌
https://t.me/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_2 Хакер Free

Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров

Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике

Excel лайфхак📌
https://t.me/Excel_lifehack

https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)

Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
🤮2
📌 Stream API: Группировка данных в Java

Привет, друзья! Сегодня разберем мощную возможность Stream API – группировка данных с помощью Collectors.groupingBy(). Это отличный инструмент, когда нужно собирать элементы в группы по какому-то признаку.

📌 Как это работает?
Метод groupingBy используется в Collectors и позволяет группировать элементы по ключу, который мы указываем. Давайте рассмотрим на примере:


import java.util.*;
import java.util.stream.Collectors;

class Person {
String name;
String city;

Person(String name, String city) {
this.name = name;
this.city = city;
}

@Override
public String toString() {
return name;
}
}

public class GroupingExample {
public static void main(String[] args) {
List<Person> people = List.of(
new Person("Иван", "Москва"),
new Person("Анна", "Санкт-Петербург"),
new Person("Сергей", "Москва"),
new Person("Мария", "Казань"),
new Person("Алексей", "Санкт-Петербург")
);

Map<String, List<Person>> groupedByCity = people.stream()
.collect(Collectors.groupingBy(person -> person.city));

groupedByCity.forEach((city, residents) ->
System.out.println(city + ": " + residents)
);
}
}


📌 Разбор кода:
1. У нас есть список people с объектами Person, у которых есть name и city.
2. Мы применяем groupingBy, передавая person -> person.city в качестве критерия группировки.
3. Результат – Map<String, List<Person>>, где ключ – город, а значение – список людей из этого города.
4. Выводим результат, используя forEach.

📌 Выходные данные:

Москва: [Иван, Сергей]
Санкт-Петербург: [Анна, Алексей]
Казань: [Мария]


👉 Теперь представьте, что у вас есть заказы в интернет-магазине, и вам нужно сгруппировать их по статусу. Или у вас есть список сотрудников, и вы хотите разбить их по департаментам. groupingBy() – это универсальный инструмент, который решает такие задачи.

📌 Дополнительные фишки:
1. Подсчет количества элементов в группах:

Map<String, Long> countByCity = people.stream()
.collect(Collectors.groupingBy(p -> p.city, Collectors.counting()));


2. Группировка + редукция: (например, получение списка имен)

Map<String, Set<String>> namesByCity = people.stream()
.collect(Collectors.groupingBy(p -> p.city,
Collectors.mapping(p -> p.name, Collectors.toSet())));


👉@BookJava
👍6
#Java springboot
Совет: Нужно быстро собрать разрозненные данные в POST-запросе?

Просто создайте встроенную record в вашем
@RestController и используйте её как @RequestBody.

Не нужно определять DTO в отдельном классе – record будет видна только внутри этого контроллера. 🚀

👉@BookJava
👍10
🚀 Совет по Spring API 🚀

LocaleContextHolder

Стратегия для хранения текущей локали потокобезопасным способом. Полезно для получения текущей локали без необходимости передавать её явно через параметры методов. 🔥

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/i18n/LocaleContextHolder.html

👉@BookJava
👍3
👩‍💻 Создание приложения Блокнот на Java 👩‍💻

🗓 24 марта в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java-разработчик».

На вебинаре мы разработаем полноценное приложение «Блокнот» с графическим пользовательским интерфейсом, демонстрирующее базовые принципы создания текстового редактора на Java.

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

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

Спикер Александр Фисунов — Senior Kotlin Developer в SSP Software на проекте ВТБ, опытный Java-разработчик и кандидат технических наук.

🔗 Ссылка на регистрацию: https://vk.cc/cJP0NY

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🛠️ SOLID: Почему важно соблюдать принципы?

Сегодня поговорим о SOLID – пяти принципах, которые делают код понятным, гибким и легким для поддержки. Если ты хочешь писать код, который не треснет по швам через пару месяцев, эти принципы — твои лучшие друзья.

1. Single Responsibility Principle (SRP)
Одна ответственность – один класс.
Если у класса больше одной причины измениться, значит, он нарушает SRP. Такой код сложно поддерживать, потому что при изменении одной логики мы можем случайно сломать другую.

Правильно:

class ReportGenerator {
void generateReport() { /* Логика генерации отчета */ }
}

class ReportSaver {
void saveReport() { /* Логика сохранения отчета */ }
}

Неправильно (всё в одном месте):

class ReportService {
void generateAndSaveReport() { /* Генерация + сохранение отчета */ }
}


2. Open/Closed Principle (OCP)
Код открыт для расширения, но закрыт для модификации.
Когда нам нужно добавить новую функциональность, мы должны расширять существующий код, а не менять его.

Пример с интерфейсом:

interface Payment {
void process();
}

class CreditCardPayment implements Payment {
public void process() { /* Логика оплаты картой */ }
}

class PayPalPayment implements Payment {
public void process() { /* Логика оплаты PayPal */ }
}

Теперь мы можем добавить новый способ оплаты, просто создав новый класс.

3. Liskov Substitution Principle (LSP)
Дочерние классы должны полностью заменять родительские.
Если где-то используется родительский класс, мы должны без проблем подставить его потомка.

Нарушение LSP:

class Bird {
void fly() { /* Летает */ }
}

class Penguin extends Bird {
void fly() { throw new UnsupportedOperationException("Пингвины не летают!"); }
}

Проблема в том, что Penguin нарушает контракт родителя.

Используем интерфейсы:

interface Bird { }
interface FlyingBird extends Bird { void fly(); }

class Sparrow implements FlyingBird {
public void fly() { /* Летает */ }
}

class Penguin implements Bird {
// Пингвин вообще не имеет метода fly()
}


4. Interface Segregation Principle (ISP)
Лучше несколько маленьких интерфейсов, чем один большой.

Плохой пример:

interface Worker {
void work();
void eat();
}

class Robot implements Worker {
public void work() { /* Работает */ }
public void eat() { throw new UnsupportedOperationException("Роботы не едят!"); }
}

Разделяем интерфейсы:

interface Workable {
void work();
}

interface Eatable {
void eat();
}

class Robot implements Workable {
public void work() { /* Работает */ }
}


5. Dependency Inversion Principle (DIP)
Модули верхнего уровня не должны зависеть от модулей нижнего уровня.
Оба должны зависеть от абстракций.

Жёсткая зависимость:

class Lamp {
void turnOn() { /* Включить */ }
}

class Switch {
private Lamp lamp;

Switch(Lamp lamp) {
this.lamp = lamp;
}

void press() { lamp.turnOn(); }
}

Используем абстракции:

interface Switchable {
void turnOn();
}

class Lamp implements Switchable {
public void turnOn() { /* Включить */ }
}

class Switch {
private Switchable device;

Switch(Switchable device) {
this.device = device;
}

void press() { device.turnOn(); }
}



📌 Итог
Принципы SOLID помогают писать гибкий, поддерживаемый и расширяемый код. Если следовать этим принципам, код будет легче читать и рефакторить.

Используешь ли ты SOLID в своих проектах? Напиши в комментариях, какой принцип для тебя самый сложный!

👉 @BookJava
👍12
👩‍💻 Открытый урок «DAO на Spring JDBC»

🗓 26 марта в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Разработчик на Spring Framework»

Использование нативного SQL с Spring JDBC позволяет создать безопасное, поддерживаемое и тестируемое DAO для эффективного доступа к данным.

О чём поговорим:
- Преимущества нативного SQL при разработке DAO.
- Основные возможности Spring JDBC для работы с запросами.
- Подходы к обеспечению безопасности и тестируемости DAO.

🔗 Ссылка на регистрацию: https://vk.cc/cJRacK

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Совет Spring Framework💡

Вы можете инжектировать (autowire) бины, которые могут отсутствовать, обернув их в java.util.Optional. Таким образом вы сообщаете, что этот бин является необязательным, избегаете исключения, если он не существует, и можете аккуратно обработать его отсутствие с помощью Optional API.

👉@BookJava
👍11👎2🔥2
📌 Почему Optional не стоит использовать в качестве параметра метода?

Сегодня разберем один из популярных вопросов: можно ли использовать Optional в параметрах метода? Казалось бы, это удобный способ передавать необязательный аргумент, но есть нюансы.

🚫 Почему это плохая практика?

1️⃣ Усложнение API
Когда метод принимает Optional, это вынуждает вызывающий код создавать Optional.of(value), даже если он не использует Optional в своем контексте. Это добавляет лишнюю работу.

2️⃣ Неявность кода
Если метод принимает Optional, становится неясно, можно ли просто передать null или обязательно использовать Optional.empty().

3️⃣ Снижение читаемости и удобства
Обычное условие if (param != null) проще и понятнее, чем if (param.isPresent()).

4️⃣ Не поддерживается стандартом Java API
В JDK не встретишь API, где Optional используется как параметр метода. Это не случайность — так принято по соглашению.

Как правильно?

Используйте обычные перегруженные методы или @Nullable аннотацию:


public void process(String value) {
// обработка значения
}

public void process() {
process("default");
}


Если параметр действительно может быть null, то лучше явно работать с null, чем принудительно оборачивать его в Optional.


👉@BookJava
👍3
🤝 Если код работает, это еще не значит, что он работает эффективно. Хотите разобраться, как ускорить приложения, найти утечки памяти и правильно деплоить их в облака?

🦾 На повышении квалификации «Java Developer. Advanced» вы изучите JVM на глубоком уровне, научитесь профилировать приложения, оптимизировать их под высокие нагрузки и выстраивать продвинутый мониторинг.

✔️ Глубокое погружение в устройство JVM
✔️ Практика с профилированием и трассировкой
✔️ Работа с Kubernetes, Prometheus и Grafana
✔️ Настройка метрик и логирования

Осталось несколько дней до закрытия набора.

➡️ Пройдите короткое тестирование для проверки своих навыков и присоединяйтесь к группе: https://vk.cc/cJT8Ny

🎁 Начните обучение со скидкой, подробности у менеджеров. ПРОМОКОД: JAVA_03

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Что такое synchronized?

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


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

Когда несколько потоков обращаются к общим данным (например, к переменной, коллекции, объекту), может возникнуть состояние гонки (race condition), приводящее к некорректной работе программы. Чтобы этого избежать, и используется synchronized.



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

synchronized блокирует объект или класс, чтобы другие потоки не могли войти в синхронизированную секцию, пока текущий поток её не покинет.

Примеры

🔹 Синхронизация метода (экземпляра):


public synchronized void increment() {
count++;
}


Этот метод можно вызвать только одному потоку в момент времени на одном экземпляре объекта.

🔹 Синхронизация блока кода:


public void increment() {
synchronized (this) {
count++;
}
}


🔹 Синхронизация по классу (для статических данных):


public static synchronized void increment() {
staticCount++;
}


или


synchronized (MyClass.class) {
staticCount++;
}




Важно помнить:

- synchronized влияет на производительность, т.к. вызывает блокировки.
- Не стоит использовать его без необходимости — иногда лучше использовать более тонкие механизмы, например, java.util.concurrent.locks.Lock или атомарные классы (AtomicInteger и т.д.).
- Ошибки синхронизации могут приводить к deadlock'ам, если неправильно проектировать взаимные блокировки.

👉@BookJava
👍31
This media is not supported in your browser
VIEW IN TELEGRAM
Совет💡: если ты обожаешь Ctrl + C и Ctrl + V, тебе точно понравится и Ctrl + W.

Это как выделение текста с помощью AI 😉

https://www.jetbrains.com/help/idea/working-with-source-code.html#editor_code_selection

👉@BookJava
👍92🔥1
👩‍💻 Rate-limiter. Bucket4j

Приглашаем на открытый урок.

🗓 24 марта в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional».

Продолжаем изучать библиотеки обеспечения устойчивости приложений. На примере Bucket4j посмотрим устройство распределенного Rate-limiter-а.

О чём поговорим:

✔️ Познакомимся с библиотекой Bucket4j.
✔️ Узнаем основные принципы действия и сценарии применения.

Кому будет интересно:
Вебинар будет полезен Java-разработчикам, архитекторам ПО и инженерам по устойчивости систем, заинтересованным в эффективном управлении потоками запросов и защите приложений от перегрузок.

🔗 Ссылка на регистрацию: https://vk.cc/cJUU0G

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Хранилище файлов. Java + WebDav

Java + WebDav - загружаем файл на webdav через Rest запрос.

00:00 Приветствие
00:34 Spring Init
00:55 Docker Hub
01:54 docker-compose
04:25 webdav.conf
06:00 application.yaml
06:50 Sardine
07:36 WebDavConfig
09:15 WebConfig
11:40 FileService
14:09 Controller
17:22 Docker Fix
17:47 Postman
18:16 что не так?
20:46 Подписывайтесь

источник

👉@BookJava
👍5
🔧 Как ускорить сборку Maven проекта в 3 раза

Сегодня покажу пару приёмов, которые помогут тебе значительно ускорить сборку Maven проекта. Особенно полезно, если ты работаешь с большими монолитами или частыми CI/CD прогонками.

🚀 1. Включи параллельную сборку

Добавь флаг -T (thread count), чтобы Maven собирал модули параллельно:


mvn clean install -T 1C


1C — это количество потоков = количеству ядер CPU. Можешь указать, например, -T 4 для 4 потоков. Эффект — сборка может стать в 2–4 раза быстрее.

🧹 2. Пропускай тесты, если они не нужны

Когда работаешь над UI, версткой или конфигурацией:


mvn clean install -DskipTests


⚠️ -DskipTests — пропускает *и* компиляцию тестов, и сами тесты.
Если хочешь только не запускать тесты, используй:


mvn clean install -Dmaven.test.skip=false -DskipTests=true


📦 3. Используй mvn dependency:go-offline

Это скачает все зависимости, плагины и сделает тебя независимым от интернета:


mvn dependency:go-offline


Полезно для CI и работы в поезде ✈️


👉@BookJava
👍9