Библиотека Java разработчика
Open in Telegram
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP
Show more9 996
Subscribers
No data24 hours
-157 days
-6130 days
Posts Archive
Чем отличается ReentrantLock от обычного Lock?
Lock – это интерфейс, ReentrantLock – его реализация. «Reentrant» говорит о том, что один и тот же поток может перезахватывать уже захваченный лок. Интерфейс не требует этого свойства. Обычный блок synchronized тоже является reentrant – вложенная синхронизация на том же мониторе отработает без проблем.
Примеры не-reentrant локов из стандартной библиотеки – представления класса StampedLock, возвращаемые его методами asReadLock() и asWriteLock().
👉@BookJavaСовет по Spring Boot💡
После аннотации bean с
@Validated, вы можете использовать параметры метода валидации с аннотациями валидации bean, такими как @NotNull, @NotBlank и т.д.
👉@BookJava👩💻 Как стать востребованным Java-разработчиком с нуля?
Получить все необходимые навыки до уровня Middle на комплексном онлайн-курсе «Специализация Java-разработчик» от OTUS.
После обучения вы сможете:
➡️ Создавать приложения на Java
➡️ Работать с реляционными базами данных
➡️ Разрабатывать серверные веб-приложения
➡️ Претендовать на позиции Middle Java Developer
📌Вы освоите все необходимые инструменты, создадите выпускной проект под руководством опытных специалистов из ведущих компаний и добавите его в портфолио.
➡️ Оставьте заявку прямо сейчас и получите спеццену на курс: https://vk.cc/cxY5lG
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruСовет по Spring Boot💡
Когда вам нужно настроить bean, предоставляемый Spring Boot, проверьте наличие интерфейсов *
Customizer - велика вероятность, что вы сможете настроить bean, не отказываясь от автоконфигурации.
👉@BookJavaЧто такое StringJoiner?
⚫️
ObjDoubleConsumer<T> - операция, которая принимает два аргумента классов T и Double, производит с ними некоторое действие и ничего не возвращает;
⚫️ObjLongConsumer<T> - операция, которая принимает два аргумента классов T и Long, производит с ними некоторое действие и ничего не возвращает;
⚫️ObjIntConsumer<T> - операция, которая принимает два аргумента классов T и Integer, производит с ними некоторое действие и ничего не возвращает.
👉@BookJava👨🎓 Java Developer Professional: Что говорят студенты о курсе?
Сегодня один из выпускников курса Java Developer Professional от Отус, Алексей Андреев, расскажет о своем опыте.
Смотреть видео отзыв: https://vk.cc/cxSnkL
Студенты Java Developer Professional выделяют следующие преимущества курса:
✔️ Обилие практических заданий.
✔️ Высокая экспертиза преподавателей.
✔️ Интересный контент, особенно для тех, кто уже знаком с языком Java.
После прохождения курса студенты чувствуют себя увереннее в профессиональной сфере и отмечают, что им легче развиваться в профессии.
Группа стартует уже 27 июня! Успейте присоединится.
Чтобы оценить свой уровень знаний для обучения на курсе, пройдите вступительный тест.
👉 ПРОЙТИ ТЕСТ: https://vk.cc/cxSni4
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Spring Boot 3.2: замените свой RestTemplate на RestClient
В мире Spring Boot отправка HTTP запросов к внешним сервисам является весьма распространенной задачей. Традиционно при достижении этой цели разработчики полагались на RestTemplate. Однако, по мере развития Spring Framework, на свет появился новый и более мощный способ обработки HTTP запросов: так называемый WebClient. Spring Boot 3.2 представил нам новый API для REST запросов: RestClient, использующий те же принципы fluent api, что и WebClient.
RestClient предлагает нам более современные и интуитивно понятные способы взаимодействия с RESTful сервисами.
https://habr.com/ru/companies/spring_aio/articles/822529/
👉@BookJava
Реализация авторизации на основе ролей в Spring Boot с помощью Keycloak
Контроль доступа на основе ролей является обязательным условием для любого приложения, имеющего дело с пользователями, которые могут получать доступ к определенным ресурсам в зависимости от своей роли в организации.
В предыдущей статье мы узнали, как защитить Spring Boot REST API с помощью Keycloak, используя протокол аутентификации OpenID Connect.
В этой статье мы добавим авторизацию на основе ролей.
Цель состоит в том, чтобы разрешить доступ к некоторым конечным точкам только пользователям с определенной ролью. Точнее, мы собираемся ограничить доступ к конечной точке DELETE и сделать его доступным только пользователям с ролью администратора.
https://gauthier-cassany.com/posts/spring-boot-keycloak-roles
👉@BookJava
⁉ Готовы освоить любимый язык опытных разработчиков и сделать свой стек непобедимым?
Ждём вас на открытом практическом уроке «Знакомство с Clojure, идеология, синтаксис и основные особенности» от OTUS, где мы:
- поговорим о том, что из себя представляет язык Clojure;
- обсудим предысторию его появления и основную идеологию;
- продемонстрируем выполнение кода в REPL и взаимодействие с ним из IDE;
- ответим на все возникающие вопросы.
🔔Встречаемся 25 июня в 19:00 мск в рамках курса «Clojure Developer». Все участники вебинара получат специальную цену на обучение!
➡ Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок.
Как Spring Framework реализует паттерн Dependency Injection?
Инверсия контроля (inversion of control, IoC) – принцип проектирования, по которому контроль над потоком управления передается фреймворку. Управляющий и прикладной код разделяются. При разработке модуля этот подход избавляет от необходимости знать о других модулях программы и деталях их взаимодействия. Такой код становится более переипользуемым и модульным, уменьшает связность.
Внедрение зависимостей (Dependency Injection, DI) – одна из реализаций IoC. При взаимодействии с другими модулями, программа оперирует высокоуровневыми абстракциями, тогда как конкретная её реализация поставляется фреймворком.
Стандартная реализация DI – фреймворк инстанциирует все сервисы, и складывает их в IoC-контейнер. При этом специальная сущность, Service Locator, занимается поиском соответствия реализаций абстракциям и их внедрением.
Spring – большой набор различных библиотек. DI реализуется одной из основных библиотек – Spring IoC.
Сущности бизнес-логики в Spring, как и в JavaEE называются beans. Бины объявляются различными способами, корни большинства из них лежат в понятии Configuration. В качестве контейнера бинов выступает ApplicationContext. Чтобы передать инициализацию зависимости контексту, она помечается аннотацией
@Autowired.
👉@BookJavaДля чего нужны функциональные интерфейсы UnaryOperator<T>, DoubleUnaryOperator, IntUnaryOperator и LongUnaryOperator?
UnaryOperator<T> (унарный оператор) принимает в качестве параметра объект типа T, выполняет над ними операции и возвращает результат операций в виде объекта типа T:
UnaryOperator<Integer> operator = x -> x * x;
System.out.println(operator.apply(5)); // 25
⚫️DoubleUnaryOperator - унарный оператор получающий на вход Double;
⚫️IntUnaryOperator - унарный оператор получающий на вход Integer;
⚫️LongUnaryOperator - унарный оператор получающий на вход Long.
👉@BookJava🧑💻 Виды тестов. Основные инструменты и их использование
Ждём вас на первом занятии серии открытых практических уроков по тестированию Spring-приложений от OTUS, где мы:
- сделаем фокус на теории и основных инструментах тестирования Java-приложений;
- обсудим, как сделать наше приложение тестируемым, какие тесты бывают и как для их написания использовать такие фреймворки и библиотеки как JUnit5, Mockito, AssertJ с учетом некоторых их особенностей и возможностей;
- ответим на все возникающие вопросы.
Спикер — Senior Software Engineer и опытный преподаватель.
Встречаемся 24 июня в 20:00 мск в преддверии старта курса «Разработчик на Spring Framework».
Все участники вебинара получат специальную цену на обучение!
8️⃣9️⃣🔟Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок: https://vk.cc/cxOdSX
🎁 Только до 23 июня скидка на курс 10%, подробности у наших менеджеров - просто оставь заявку.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruОбновление Java с 17 на 21: через тернии к звездам
Меня зовут Денис, я тимлид команды R&D в Naumen Service Management Platform.
Как большие почитатели языка Java, мы, Naumen Service Management Platform, стараемся мигрировать на свежие версии языка. Причин множество: это и улучшенная безопасность, и появление крутых языковых фич, и буст перформанса. Но путь не всегда оказывается простым.
В докладе я расскажу, с какими проблемами и препятствиями мы столкнулись при обновлении продукта Naumen SMP на новую LTS версию Java. Также поделюсь мыслями, а зачем вообще стоит обновляться.
Доклад будет полезен разработчикам и техлидам, которые задумываются или уже планируют миграцию их систем на Java 21.
https://habr.com/ru/companies/naumen/articles/822639/
👉@BookJava
Что делает семафор?
Семафор – один из старейших примитивов синхронизации. Он был изобретен Дейкстрой в 1968 году. По большому счету это счетчик, который можно увеличивать и уменьшать из разных потоков. Уменьшение до 0 блокирует уменьшающий поток. Состояние, когда счетчик больше нуля называют сигнальное состояние, операцию его увеличения – release (освобождение) или signal, уменьшения – acquire (захват) или wait.
На практике можно представить, что release – выделение квоты доступа к критической секции программы. acquire – использование необходимого объема доступной квоты, или ожидание, если её не хватает.
В Java семафор реализован классом Semaphore. Состоит этот класс в основном из разных форм методов acquire (с таймаутом, с игнорированием InterruptedException, неблокирующий) и release. Методы могут принимать параметр permits – тот самый объем квот, которые необходимо освободить/захватить.
Несколько вспомогательных методов позволяют узнать больше о количестве и составе очереди потоков, которые ждут освобождения пермитов. А методы availablePermits и drainPermits позволяют узнать количество оставшихся пермитов, и захватить их все соответственно. В конструкторе конфигурируются изначальное количество пермитов, и свойство fair (аналогичное свойству ReentrantLock).
👉@BookJava
🚀 От новичка до Middle+ в Java-разработке под руководством лучших экспертов ниши!
Актуальное обучение для всех, кто хочет стать Java-разработчиком с нуля и для тех, кто еще не определился с языком программирования.
📌После онлайн-курса «Специализация Java-разработчик» от OTUS вы сможете:
- создавать современные приложения на Java;
- работать с реляционными базами данных;
- разрабатывать серверные веб-приложения;
- претендовать на позиции Middle Java Developer.
Вы освоите самые востребованные инструменты и лучшие практики.
Забудьте о скучном обучении — здесь вас ждут настоящие челленджи и нестандартные практические решения. А еще сильные проекты для портфолио и карьерный сапорт!
🎁 Успей на курс! Только до 23 июня скидка 10%, подробности у наших менеджеров - просто оставь заявку.
Старт уже 28 июня.
👉 Изучите подробности и оставьте заявку, чтобы получить специальную цену на курс: https://vk.cc/cxMyWB
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576Для чего нужны функциональные интерфейсы Function<T,R>, DoubleFunction<R>, IntFunction<R> и LongFunction<R>?
Function<T, R> - интерфейс, с помощью которого реализуется функция, получающая на вход экземпляр класса
T и возвращающая на выходе экземпляр класса R.
Методы по умолчанию могут использоваться для построения цепочек вызовов (compose, andThen).
Function<String, Integer> toInteger = Integer::valueOf;
Function<String, String> backToString = toInteger.andThen(String::valueOf);
backToString.apply("123"); // "123"
⚫️DoubleFunction<R> - функция получающая на вход Double и возвращающая на выходе экземпляр класса R;
⚫️IntFunction<R> - функция получающая на вход Integer и возвращающая на выходе экземпляр класса R;
⚫️LongFunction<R> - функция получающая на вход Long и возвращающая на выходе экземпляр класса R.
👉@BookJavaЧто такое «функциональные интерфейсы»?
Функциональный интерфейс - это интерфейс, который определяет только один абстрактный метод.
Чтобы точно определить интерфейс как функциональный, добавлена аннотация
@FunctionalInterface, работающая по принципу @Override. Она обозначит замысел и не даст определить второй абстрактный метод в интерфейсе.
Интерфейс может включать сколько угодно default методов и при этом оставаться функциональным, потому что default методы - не абстрактные.
👉@BookJavaКак разобраться в вышмате за 1 вечер? 😨
Да никак. Но можно научиться понимать математику. И сберечь месяцы жизни, кучу нервов и сил.
В помощь вам - полезный канал о высшей математике. Его автор - выпускник СПБГУ, а ныне — преподаватель предмета.
На простом языке объясняет сложные вещи, даёт шпаргалки и проводит эфиры с решением задач 📈
Находка для всех, кому нужен вышмат по жизни. От полезных материалов и разборов до ответов на любые вопросы и живых дискуссий в комментариях.
Посмотрите сами 👉 @lav_math
Как применяют технологию SPI
Service Provider Interface – технология из стандартной поставки JavaSE. Этой технологией реализуется IoC, не являющаяся при этом DI. С помощью SPI можно легко и без дополнительных инструментов поставлять конкретные реализации сервисов отдельными jar-файлами. Применение обычно похоже на механизм плагинов.
Два основных понятия SPI – это service и service provider. Service – интерфейс или абстрактный класс, который объявляет API требуемого сервиса, и предоставляется основным приложением. Service provider – реализация этого API, наследник класса/интерфейса сервиса, который динамически поставляется в основное приложение библиотекой-плагином. Для одного сервиса может быть предоставлено несколько провайдеров из одной или нескольких библиотек.
На интерфейс сервиса не накладывается никаких ограничений. Провайдер же обязан реализовывать этот интерфейс, и иметь конструктор без параметров. Внутри jar-файла в директории META-INF/services лежат текстовые файлы, где имя файла – полное имя сервиса, а его строчки – полные имена провайдеров этого сервиса, которые поставляются этой библиотекой.
Для получения провайдеров всех библиотек приложения используется класс ServiceLoader. Это итератор по сервис-провайдерам, а создается он статическим методом load, в который параметром передается интерфейс/абстрактный класс интересующего сервиса.
Доступ к файлам-ресурсам из classpath обеспечивается загрузчиком классов, поэтому дополнительно при загрузке можно указать специфический загрузчик. С появлением модульности в Java 9 можно также указать модуль.
SPI повсеместно используется в стандартной библиотеке JDK. С его помощью подключаются JDBC-драйверы. Через ServiceLoader также загружаются таймзоны, системные настройки, кодировки, провайдеры файловой системы и многое другое.
👉@BookJava
