JMH — это фреймворк от команды разработчиков JVM (Oracle), который помогает создавать и запускать микробенчмарки для измерения производительности Java-кода. Если вы хотите точно понять, насколько быстро работает ваш код (например, сравнить эффективность разных алгоритмов или подходов), JMH — ваш незаменимый помощник.
— Точные измерения:
JMH учитывает влияние JIT-компиляции, прогрева JVM и других факторов, которые могут искажать результаты.
— Простота использования:
Написание бенчмарков интуитивно, и вы сразу видите, что влияет на производительность.
— Гибкость настройки:
Вы можете задавать параметры для тестов, такие как число итераций, потоков, warm-up период и другие.
— Добавьте зависимость JMH в ваш проект:
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.38</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.38</version>
</dependency>
или
implementation 'org.openjdk.jmh:jmh-core:1.38'
annotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:1.38'
— Создайте бенчмарк-класс:
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Thread)
public class MyBenchmark {
@Benchmark
public int testMethod() {
return calculate(1000);
}
private int calculate(int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += i;
}
return sum;
}
}
— Запустите тесты:
Используйте mvn package или gradle build, чтобы собрать проект, и запустите JMH-тесты.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥7❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍8🔥5
— NLB (Network Load Balancer) – распределяет трафик на уровне IP. Он работает на более низком уровне и не анализирует HTTP-запросы.
— ALB (Application Load Balancer) – маршрутизирует запросы на основе HTTP-заголовков или URL. ALB предлагает более сложные правила маршрутизации. Выбор между NLB и ALB зависит от ваших потребностей. Для простых сервисов в небольших масштабах одного балансировщика нагрузки может быть достаточно.
— API Gateway – работает на уровне приложений и берет на себя задачи, такие как аутентификация, ограничение скорости запросов, кэширование и другие. Его функции отличаются от Load Balancer.
Схема иллюстрирует детали работы этих компонентов. Чаще всего Load Balancer и API Gateway используются вместе, чтобы создать масштабируемую и безопасную архитектуру для современных веб-приложений.
— Опция A: ALB + сервисы
ALB распределяет запросы между различными сервисами. Ограничение запросов, аутентификация и другие функции реализуются на уровне сервисов. Это более гибкий подход, но требует больше работы при разработке.
— Опция B: API Gateway + сервисы
API Gateway берет на себя функции аутентификации, ограничения запросов, кэширования и других задач. Это упрощает разработку сервисов, но уменьшает гибкость по сравнению с первым вариантом.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤9🔥4
Spring Boot + React Admin: CRUD — это только начало! Улучшаем админку вместе с Amplicode
🌐 🗣 СМОТРЕТЬ VKVIDEO
📺 🗣 СМОТРЕТЬ RUTUBE
📝 🗣 СМОТРЕТЬ DZEN
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3🔥3
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍6🔥5
Forwarded from Java Guru 🤓
Какая настройка при создании связи Customer-Order приведет к неправильному поведению при сохранении нескольких Order, связанных с одним Customer?
👍6🔥3
Forwarded from Java Guru 🤓
Какая настройка при создании связи Customer-Order приведет к неправильному поведению при сохранении нескольких Order, связанных с одним Customer?
Anonymous Quiz
21%
CascadeType.ALL
15%
fetch = FetchType.EAGER
10%
optional = false
45%
unique = true
10%
referencedColumnName
👍7🔥4
Паттерн Интерпретатор (Interpreter)
Interpreter — это поведенческий паттерн, который предоставляет способ вычисления выражений, заданных на каком-либо языке. Он определяет грамматику языка, а также интерпретатор, который использует эту грамматику для выполнения выражений.
Когда использовать
🟢 Для интерпретации выражений на языке, когда есть грамматика для их описания.
🟢 Для создания простых языков с ограниченным синтаксисом, таких как математические выражения, поисковые запросы или фильтры.
🟢 Для упрощения расширения и модификации языка или грамматики, особенно, если эти изменения требуются часто.
Преимущества
1️⃣ Упрощает добавление новых правил грамматики или изменение существующих.
2️⃣ Структурирует описание языка, разделяя грамматику и логику выполнения.
3️⃣ Подходит для различных задач, связанных с анализом и интерпретацией.
Недостатки
1️⃣ Становится громоздким при работе со сложными языками с большим количеством правил.
2️⃣ Показывает низкую производительность при построении деревьев выражений и их интерпретации для больших объемов данных.
3️⃣ Сложен в поддержке, если язык активно развивается и усложняется.
Interpreter хорошо подходит для создания простых языков, например, DSL (domain-specific language), и позволяет реализовать мощные возможности анализа и исполнения выражений.
Однако для более сложных языков лучше использовать специализированные инструменты вроде ANTLR или парсеров.
✅ Java библиотека #java
Interpreter — это поведенческий паттерн, который предоставляет способ вычисления выражений, заданных на каком-либо языке. Он определяет грамматику языка, а также интерпретатор, который использует эту грамматику для выполнения выражений.
Когда использовать
Преимущества
Недостатки
Interpreter хорошо подходит для создания простых языков, например, DSL (domain-specific language), и позволяет реализовать мощные возможности анализа и исполнения выражений.
Однако для более сложных языков лучше использовать специализированные инструменты вроде ANTLR или парсеров.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤6🔥5
Наш чатик с вакансиями и резюме, присоединяйся: https://news.1rj.ru/str/job_java
Telegram
Java Job - Вакансии и резюме
Наш канал по Java @javalib
Вакансии Java, также можете скидывать свои резюме!
Купить звёзды: @PremiumBot
Вакансии Java, также можете скидывать свои резюме!
Купить звёзды: @PremiumBot
👍5❤3🔥3
Spring и Spring Boot. Разработка облачных приложений на Java (2025) PDF
В книге рассмотрено актуальное состояние технологий Spring и Spring Boot, помогающих шире раскрыть возможности языка Java и аспектно-ориентированного программирования. Пошагово объяснено, как самостоятельно написать и развернуть облачный проект под управлением Spring. Рассказано о координации микросервисов на Java с применением Spring и модуля Spring Core способах внедрения зависимостей, аннотировании кода. На примере сквозного веб-приложения описаны важнейшие приемы работы с данными в стиле REST, тестирование данных, обеспечение согласованности, безопасности и долговременного хранения данных в приложении.
Для Java-программистов.
В книге рассмотрено актуальное состояние технологий Spring и Spring Boot, помогающих шире раскрыть возможности языка Java и аспектно-ориентированного программирования. Пошагово объяснено, как самостоятельно написать и развернуть облачный проект под управлением Spring. Рассказано о координации микросервисов на Java с применением Spring и модуля Spring Core способах внедрения зависимостей, аннотировании кода. На примере сквозного веб-приложения описаны важнейшие приемы работы с данными в стиле REST, тестирование данных, обеспечение согласованности, безопасности и долговременного хранения данных в приложении.
Для Java-программистов.
👍21🔥8❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤5🔥3
Узнаём какое аниме будет самым рейтинговым еще до выхода
Когда встал вопрос "о чем писать диплом", я точно знала, что не хочу писать о чем-то скучном или не интересным для меня. Было много идеи (не только про аниме) и даже в сфере аниме - не только про задачу прогнозирования. Когда уже надо было утверждать тему, на одной из лекции как раз рассказывали про задачи классификации и прогнозирования. Я знала, что уже есть вагон и маленькая тележка статей про прогнозирование в области фильмов, но в аниме? Критически мало. И я решила это исправить)
Читать статью
Когда встал вопрос "о чем писать диплом", я точно знала, что не хочу писать о чем-то скучном или не интересным для меня. Было много идеи (не только про аниме) и даже в сфере аниме - не только про задачу прогнозирования. Когда уже надо было утверждать тему, на одной из лекции как раз рассказывали про задачи классификации и прогнозирования. Я знала, что уже есть вагон и маленькая тележка статей про прогнозирование в области фильмов, но в аниме? Критически мало. И я решила это исправить)
Читать статью
VK
Узнаём какое аниме будет самым рейтинговым еще до выхода
Когда встал вопрос "о чем писать диплом", я точно знала, что не хочу писать о чем-то скучном или неинтересным для меня. Было много идеи (..
👍7❤3🔥3
Если часто используете String для конкатенации (+), замените его на StringBuilder — это ускорит выполнение и снизит нагрузку на память.
String result = "";
for (int i = 0; i < 1000; i++) {
result += i; // Каждое сложение создаёт новый объект
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < 1000; i++) {
result.append(i); // Использует один буфер, без лишних объектов
}
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍21🔥7❤5
❓Java Guru - вопросы и задачи с собеседований. Канал с помощью которого ты точно получишь оффер!
👩💻 Android Developer - канал для андроид разработчиков! Статьи, вопросы и задачи с собеседований, лайфхаки.
👩💻 Kotlin Developer - самый топовый канал для котлин разработчика!
📕 Книги для Java программиста - канал с книгами по Java. Постоянно выходят новинки как на русском так и на английском языке!
📰 Java News - канал с последними новостями из мира Java!
📕 Книги для Java программиста - канал с книгами по Java. Постоянно выходят новинки как на русском так и на английском языке!
📰 Java News - канал с последними новостями из мира Java!
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍5❤3🔥2
Кнопка «F5» устала: real-time уведомления в микросервисной архитектуре
Представьте себе: у вас железнодорожная станция, сотни вагонов, десятки пользователей в системе, каждый раз кто-то нажимает кнопку "Обновить", чтобы узнать — разгрузили ли нужный вагон.
Вся логика обновления построена на "manual refresh". Да-да, пользователь сам жмёт кнопку, чтобы получить свежие данные. Система автоматической разгрузки или другой человек разгрузил что-то на другом конце станции, но вы об этом не узнаете, пока не перезагрузите страницу.
Читать статью
Представьте себе: у вас железнодорожная станция, сотни вагонов, десятки пользователей в системе, каждый раз кто-то нажимает кнопку "Обновить", чтобы узнать — разгрузили ли нужный вагон.
Вся логика обновления построена на "manual refresh". Да-да, пользователь сам жмёт кнопку, чтобы получить свежие данные. Система автоматической разгрузки или другой человек разгрузил что-то на другом конце станции, но вы об этом не узнаете, пока не перезагрузите страницу.
Читать статью
VK
Кнопка «F5» устала: real-time уведомления в микросервисной архитектуре
Представьте себе: у вас железнодорожная станция, сотни вагонов, десятки пользователей в системе, каждый раз кто-то нажимает кнопку "Обнов..
🔥6❤3👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤5🔥3❤🔥1
GRASP: почему настоящая архитектура начинается не с SOLID
Хочу начать с личной предыстории. Давным‑давно, как и многие из вас, я читал умные книжки: «Чистый код» и «Чистая архитектура» Роберта Мартина, «Совершенный код» Стива Макконнелла и другие.
Также не обошли меня и классические принципы проектирования — SOLID, KISS, DRY — и, думаю, каждый читатель добавит сюда свои.
Безусловно, это всё важные и фундаментальные вещи.
Но однажды на горизонте появилось DDD — предметно‑ориентированное проектирование в изложении Эрика Эванса. Именно его «синяя книга» стала культовой и задала язык для архитектурного мышления.
Читать статью
Хочу начать с личной предыстории. Давным‑давно, как и многие из вас, я читал умные книжки: «Чистый код» и «Чистая архитектура» Роберта Мартина, «Совершенный код» Стива Макконнелла и другие.
Также не обошли меня и классические принципы проектирования — SOLID, KISS, DRY — и, думаю, каждый читатель добавит сюда свои.
Безусловно, это всё важные и фундаментальные вещи.
Но однажды на горизонте появилось DDD — предметно‑ориентированное проектирование в изложении Эрика Эванса. Именно его «синяя книга» стала культовой и задала язык для архитектурного мышления.
Читать статью
VK
GRASP: почему настоящая архитектура начинается не с SOLID
Многие инженеры начинают своё архитектурное мышление с SOLID. Затем изучают GoF-паттерны. Но всё равно остаётся ощущение, что чего-то не..
👍14❤4🔥3☃2❤🔥1
MapStruct: быстрый и безопасный маппинг объектов
⚙️ Как это работает
MapStruct анализирует названия полей в исходном (source) и целевом (target) классах. Если поля совпадают по названию и типу, он автоматически создаёт код для их преобразования.
Когда названия полей не совпадают, нужно явно указать соответствие с помощью аннотации @Mapping:
— source — поле в исходном классе
— target — поле в целевом классе
⌛ Как начать
1. Добавьте зависимости: mapstruct, mapstruct-processor
2. Выберите интерфейс или абстрактный класс и определите методы для преобразования объектов
3. Используйте маппер. В Spring-приложении маппер можно заинжектить как обычный бин.
❓ Абстрактный класс или интерфейс
Документация MapStruct приводит примеры с интерфейсами, но библиотека поддерживает и абстрактные классы. Выбор за вами.
Интерфейс — MapStruct сам создаёт реализацию:
Абстрактный класс — позволяет добавлять кастомную логику:
📌 Имена методов можно задавать любые. MapStruct анализирует типы аргументов и возвращаемых значений, чтобы понять, что куда маппить.
🔥 Интеграция со Spring
При использовании componentModel = "spring" маппер регистрируется как Spring-бин. Что позволяет заинжектить маппер:
💡 Где применять
— Маппинг DTO ↔️ Entity в Spring-приложениях
— Конвертация данных между разными объектами
— Обработка вложенных структур и коллекций
💬 Используете MapStruct в своих проектах? Делитесь опытом
✅ Java библиотека #java
MapStruct анализирует названия полей в исходном (source) и целевом (target) классах. Если поля совпадают по названию и типу, он автоматически создаёт код для их преобразования.
Когда названия полей не совпадают, нужно явно указать соответствие с помощью аннотации @Mapping:
— source — поле в исходном классе
— target — поле в целевом классе
@Mapping(source = "fullName", target = "name")
UserDTO toDTO(User user);
1. Добавьте зависимости: mapstruct, mapstruct-processor
2. Выберите интерфейс или абстрактный класс и определите методы для преобразования объектов
3. Используйте маппер. В Spring-приложении маппер можно заинжектить как обычный бин.
Документация MapStruct приводит примеры с интерфейсами, но библиотека поддерживает и абстрактные классы. Выбор за вами.
Интерфейс — MapStruct сам создаёт реализацию:
@Mapper(componentModel = "spring")
public interface UserMapper {
@Mapping(source = "fullName", target = "name")
UserDTO toDTO(User user);
}
Абстрактный класс — позволяет добавлять кастомную логику:
@Mapper(componentModel = "spring")
public abstract class UserMapper {
@Mapping(source = "fullName", target = "name")
public abstract UserDTO toDTO(User user);
public String mapAgeToString(int age) {
return age + " лет";
}
}
📌 Имена методов можно задавать любые. MapStruct анализирует типы аргументов и возвращаемых значений, чтобы понять, что куда маппить.
При использовании componentModel = "spring" маппер регистрируется как Spring-бин. Что позволяет заинжектить маппер:
@Service
public class UserService {
private final UserMapper userMapper;
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public UserDTO convertUser(User user) {
return userMapper.toDTO(user);
}
}
— Маппинг DTO ↔️ Entity в Spring-приложениях
— Конвертация данных между разными объектами
— Обработка вложенных структур и коллекций
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29❤9🔥5
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥6❤4