Причина простая: Spring Boot 4 перешёл на Servlet 6.1, а Undertow с этой версией Servlet API несовместим. Поэтому из Boot 4 удалили и поддержку embedded Undertow, и spring-boot-starter-undertow. Если раньше было: <artifactId>spring-boot-starter-undertow</artifactId> теперь используйте Tomcat по умолчанию или подключайте Jetty: <dependency> <groupId>org...
Java
☕️ Java-совет: не кешируйте данные по `Class<?>` через обычный `ConcurrentHashMap
☕️ Java-совет: не кешируйте данные по `Class<?>` через обычный `ConcurrentHashMap` Такой код выглядит нормально: private static final Map<Class<?>, Metadata> CACHE = new ConcurrentHashMap<>(); Metadata metadata = CACHE.computeIfAbsent( type, Metadata::inspect ); Но в приложениях с динамическими ClassLoader такой кеш может удерживать классы в памяти и мешать их выгрузке. Для этого в Java есть малоизвестный ClassValue<T>: private static final ClassValue<Metadata> CACHE = new ClassValue<>() { @Override protected Metadata computeValue(Class<?> type) { return Metadata.inspect(type); } }; Metadata metadata = CACHE...
💡 Java совет: два пути могут указывать на один и тот же файл
Path.equals() сравнивает только представление пути: Path a = Path.of("data.txt"); Path b = Path.of("./data.txt"); System.out.println(a.equals(b)); // false Хотя оба пути могут вести к одному файлу. Для проверки используйте: boolean same = Files.isSameFile(a, b); Files.isSameFile() обращается к файловой системе и учитывает: - относительные пути; - символические ссылки; - реальное расположение файла. Path file = Path...
🖥 Java можно учить месяцами - и всё равно бояться написать собственный сервер
🖥 Java можно учить месяцами - и всё равно бояться написать собственный сервер Курс «Java: с нуля до сетевого гуру» построен так, чтобы ты как можно быстрее перешёл от теории к рабочему коду. Сначала разберёшь основы языка, ООП, коллекции и исключения. Затем перейдёшь к тому, ради чего многие и выбирают Java: - многопоточность; - TCP/IP и сокеты; - клиент-серверные приложения; - обработка нескольких подключений; - собственные сетевые проекты. Каждая новая тема закрепляется практикой. Ты будешь...
💡 Spring Boot 4: найдите устаревшие настройки до того, как они сломают запуск
При миграции на Spring Boot 4 часть старых configuration properties была переименована или удалена. Проверять большие application.yml вручную необязательно — добавьте временный модуль: Gradle: runtimeOnly("org.springframework.boot:spring-boot-properties-migrator") Maven: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-properties-migrator</artifactId> <scope>runtime</scope> </dependency> ...
💡 Когда `ReentrantReadWriteLock` быстрее обычного `synchronized
` Если приложение часто читает данные и редко их изменяет, один эксклюзивный lock может стать узким местом. ReentrantReadWriteLock разделяет блокировки: - несколько потоков могут одновременно держать readLock; - writeLock получает исключительный доступ; - во время записи блокируются и читатели, и другие писатели. private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); private final Lock readLock = lock.readLock(); private final Lock writeLock = lock.writeLock(); public String get(String key) { readLock...
