Байт-код — это просто! Как сделать DI по-настоящему быстрым
Привет! Меня зовут Григорий Юрков, и я уже несколько лет работаю в инфраструктурной команде Яндекс Маркета. Два года назад мы начали разрабатывать свой легковесный DI-фреймворк Scout, который предоставляет выразительный Kotlin DSL. Он не генерирует код, а делает всю работу в рантайме.
Недавний переход с compile-time-библиотеки Dagger 2 на нашу привёл к замедлению старта приложения. Подробнее об этом и о том пути, который мы прошли от идеи до публикации в опенсорс, можно прочитать в статье моего коллеги Александра Миронычева.
В этой статье мы будем подробно рассматривать то, как применение байт-кода помогло сохранить скорость на том же уровне и спасти проект по миграции на Scout.
https://habr.com/ru/companies/yandex/articles/770800/
👉@BookJava
Привет! Меня зовут Григорий Юрков, и я уже несколько лет работаю в инфраструктурной команде Яндекс Маркета. Два года назад мы начали разрабатывать свой легковесный DI-фреймворк Scout, который предоставляет выразительный Kotlin DSL. Он не генерирует код, а делает всю работу в рантайме.
Недавний переход с compile-time-библиотеки Dagger 2 на нашу привёл к замедлению старта приложения. Подробнее об этом и о том пути, который мы прошли от идеи до публикации в опенсорс, можно прочитать в статье моего коллеги Александра Миронычева.
В этой статье мы будем подробно рассматривать то, как применение байт-кода помогло сохранить скорость на том же уровне и спасти проект по миграции на Scout.
https://habr.com/ru/companies/yandex/articles/770800/
👉@BookJava
👍3
Категоризированный список всех возможностей Java и JVM с JDK 8 по 21
С момента выхода 8-й версии и до 21-й версии Java получила 232 предложения по улучшению JDK (JEP) и множество более мелких обновлений, каждое из которых вносит определенные улучшения в платформу. Эта статья представляет собой категоризированный и курируемый список наиболее важных улучшений.
https://advancedweb.hu/a-categorized-list-of-all-java-and-jvm-features-since-jdk-8-to-21/
👉@BookJava
С момента выхода 8-й версии и до 21-й версии Java получила 232 предложения по улучшению JDK (JEP) и множество более мелких обновлений, каждое из которых вносит определенные улучшения в платформу. Эта статья представляет собой категоризированный и курируемый список наиболее важных улучшений.
https://advancedweb.hu/a-categorized-list-of-all-java-and-jvm-features-since-jdk-8-to-21/
👉@BookJava
👍4
Приведите примеры использования fork/join framework
Как следует из названий связанных классов,
Реализация fork/join для самых популярных общих случаев уже есть в стандартной библиотеке, работать непосредственно с классом
Фреймворк неявно работает и в параллельных стримах. В этом случае логику fork определяет его сплитератор, а join выполняют потоковые операции. Классический пример:
Существуют целые категории частных задач, решения которых хорошо параллелизуются: векторные операции, работа с графами, поиск данных. Для специфичных задач придется реализовывать собственные
👉@BookJava
Как следует из названий связанных классов,
ForkJoinPool
используется для рекурсивных задач. Это такие задачи, которые можно делить на порции, подзадачи. Отделение подзадачи – это операция fork, финальная агрегация результатов подзадач – join.Реализация fork/join для самых популярных общих случаев уже есть в стандартной библиотеке, работать непосредственно с классом
ForkJoinPool
не потребуется. Метод parallelSetAll
из класса Arrays
применяет fork/join для генерации элементов массива; parallelPrefix
для модификации; parallelSort
для сортировки.Фреймворк неявно работает и в параллельных стримах. В этом случае логику fork определяет его сплитератор, а join выполняют потоковые операции. Классический пример:
Arrays.stream(new int[]{1, 2, 3, 4}).parallel().sum();
Существуют целые категории частных задач, решения которых хорошо параллелизуются: векторные операции, работа с графами, поиск данных. Для специфичных задач придется реализовывать собственные
RecursiveTask
, RecursiveAction
, или Spliterator
.👉@BookJava
👍4
Что такое абстрактные классы и методы в Java
Абстрагирование – это процесс, в ходе которого от пользователя скрываются многие детали реализации, а предоставляются только те детали, которые действительно важны. Так удаётся сфокусироваться на том, что делает объект, а не как он это делает.
В Java абстрактные классы и методы – это основные инструменты для реализации абстракций. Абстрактные классы служат шаблонами для создания субклассов, а абстрактные методы можно сравнить с чертежами, описывающими поведение этих субклассов.
https://www.appsdeveloperblog.com/17-abstract-classes-and-methods-in-java/
👉@BookJava
Абстрагирование – это процесс, в ходе которого от пользователя скрываются многие детали реализации, а предоставляются только те детали, которые действительно важны. Так удаётся сфокусироваться на том, что делает объект, а не как он это делает.
В Java абстрактные классы и методы – это основные инструменты для реализации абстракций. Абстрактные классы служат шаблонами для создания субклассов, а абстрактные методы можно сравнить с чертежами, описывающими поведение этих субклассов.
https://www.appsdeveloperblog.com/17-abstract-classes-and-methods-in-java/
👉@BookJava
Apps Developer Blog
Abstract Classes and Methods in Java: Explained! - Apps Developer Blog
Learn how to use abstract classes and methods in Java to implement abstraction, improve code modularity and maintainability. Check out our tutorial!
👍4
Совет по Spring Boot 🍃💡
Если вы перешли на Java 21 и используете Spring Boot 3.1 или ниже, необходимо обновить билдер Paketo, чтобы избежать ошибки: "Builder lifecycle 'creator' failed with status code 51" при выполнении
👉@BookJava
Если вы перешли на Java 21 и используете Spring Boot 3.1 или ниже, необходимо обновить билдер Paketo, чтобы избежать ошибки: "Builder lifecycle 'creator' failed with status code 51" при выполнении
mvn spring-boot:build-image
.👉@BookJava
👍9
Avoid Lombok. Use Records to write cleaner code in Java 17
https://medium.com/naukri-engineering/avoid-lombok-use-records-to-write-cleaner-code-in-java-17-b174548a6f5f
👉@BookJava
https://medium.com/naukri-engineering/avoid-lombok-use-records-to-write-cleaner-code-in-java-17-b174548a6f5f
👉@BookJava
👍3❤1
Как новичку подарить жизнь telegram-боту на java
Как все начиналось
Мне 43 года и я профессиональный юрист. Неуемная интеллектуальная энергия и неудовлетворенность основной профессией 2,5 года назад привели меня в IT. Да-да, вот так – взрослая тетя с гуманитарным образованием решила попробовать себя на ниве программирования и замахнулась аж на такой язык как… JAVA!
https://habr.com/ru/articles/723580/
👉@BookJava
Как все начиналось
Мне 43 года и я профессиональный юрист. Неуемная интеллектуальная энергия и неудовлетворенность основной профессией 2,5 года назад привели меня в IT. Да-да, вот так – взрослая тетя с гуманитарным образованием решила попробовать себя на ниве программирования и замахнулась аж на такой язык как… JAVA!
https://habr.com/ru/articles/723580/
👉@BookJava
👍5🔥1😢1
Media is too big
VIEW IN TELEGRAM
Бэкенд-тур — возможность попасть в Яндекс за неделю
С 13 по 17 ноября техногигант проведет масштабный бэкенд-тур по 5 городам России, где яндексоиды расскажут о своих текущих проектах, продуктах и технологиях:
📍 Москва — 13.11 (здесь можно будет посмотреть онлайн-трансляцию)
📍Нижний Новгород — 14.11
📍Екатеринбург — 15.11
📍Новосибирск — 16.11
📍Санкт-Петербург — 17.11
Участники с опытом коммерческой разработки могут получить оффер в компанию всего за неделю, с 20 по 26 ноября. Предварительно нужно подать заявку на участие до 19 ноября и выполнить контест с задачами для прохождения на следующий этап. Уже в течение недели отборов разработчики пройдут 2 технические фракции с кодингом в онлайн-редакторе, пообщаются с представителями команд разработчиков Яндекса и выберут подходящее направление. До 26 ноября лучшим участникам уже презентуют офер.
Более детально ознакомиться с подробностями тура и быстрого найма в компанию можно на сайте
С 13 по 17 ноября техногигант проведет масштабный бэкенд-тур по 5 городам России, где яндексоиды расскажут о своих текущих проектах, продуктах и технологиях:
📍 Москва — 13.11 (здесь можно будет посмотреть онлайн-трансляцию)
📍Нижний Новгород — 14.11
📍Екатеринбург — 15.11
📍Новосибирск — 16.11
📍Санкт-Петербург — 17.11
Участники с опытом коммерческой разработки могут получить оффер в компанию всего за неделю, с 20 по 26 ноября. Предварительно нужно подать заявку на участие до 19 ноября и выполнить контест с задачами для прохождения на следующий этап. Уже в течение недели отборов разработчики пройдут 2 технические фракции с кодингом в онлайн-редакторе, пообщаются с представителями команд разработчиков Яндекса и выберут подходящее направление. До 26 ноября лучшим участникам уже презентуют офер.
Более детально ознакомиться с подробностями тура и быстрого найма в компанию можно на сайте
💩6
Media is too big
VIEW IN TELEGRAM
Оптимизация методов equals() с помощью метода Pattern Matching
0:00 Intro: designing equals() methods
1:13 Generating equals() and hashCode() methods
1:56 What could go wrong with a bad hashCode() method
4:31 Taking a look at the generated equals() methods
7:11 Checking the record and pattern matching implementations
9:33 What is predictive branching, what is the cost of a failing prediction?
12:41 Evaluating the cost of two failing predictions.
14:53 Evaluating the performance of equals() methods on simple data sets
16:07 First data set: all the objects are the same instance
16:46 Second data set: different instances carrying the same state
18:43 Third data set: different objects of the same type
20:41 Fourth data set: objects of different types
22:00 First conclusions on what patterns are the best
22:39 Adding glitches to the data sets
24:41 Results for first data set (same instances) with glitches
25:20 Results for second data set (equal instances) with glitches
26:07 Results for third data set (different instances) with glitches
28:30 Results for fourth data set (different types) with glitches
30:05 What conclusions can you draw from all these benches?
32:33 That's it for today, talk to you soon!
источник
👉@BookJava
0:00 Intro: designing equals() methods
1:13 Generating equals() and hashCode() methods
1:56 What could go wrong with a bad hashCode() method
4:31 Taking a look at the generated equals() methods
7:11 Checking the record and pattern matching implementations
9:33 What is predictive branching, what is the cost of a failing prediction?
12:41 Evaluating the cost of two failing predictions.
14:53 Evaluating the performance of equals() methods on simple data sets
16:07 First data set: all the objects are the same instance
16:46 Second data set: different instances carrying the same state
18:43 Third data set: different objects of the same type
20:41 Fourth data set: objects of different types
22:00 First conclusions on what patterns are the best
22:39 Adding glitches to the data sets
24:41 Results for first data set (same instances) with glitches
25:20 Results for second data set (equal instances) with glitches
26:07 Results for third data set (different instances) with glitches
28:30 Results for fourth data set (different types) with glitches
30:05 What conclusions can you draw from all these benches?
32:33 That's it for today, talk to you soon!
источник
👉@BookJava
👍1
Подборка Telegram каналов для программистов
Системное администрирование 📌
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
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT.
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование 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/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Библиотеки 📌
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 Полезные советы по программированию
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Excel лайфхак📌
https://t.me/Excel_lifehack
Системное администрирование 📌
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
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT.
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование 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/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Библиотеки 📌
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 Полезные советы по программированию
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Excel лайфхак📌
https://t.me/Excel_lifehack
👍1🤡1
Minum Web Framework
Minum - минималистичный экспериментальный Java-фреймворк, демонстрирующий принцип "меньше - значит больше".
Документация https://github.com/byronka/minum/blob/master/docs/development_handbook.md
https://github.com/byronka/minum
👉@BookJava
Minum - минималистичный экспериментальный Java-фреймворк, демонстрирующий принцип "меньше - значит больше".
Документация https://github.com/byronka/minum/blob/master/docs/development_handbook.md
https://github.com/byronka/minum
👉@BookJava
GitHub
minum/docs/development_handbook.md at master · byronka/minum
A minimalist Java web framework built from scratch - byronka/minum
👍3👎2
Байки джависта
Я конечно не Джеймс Гослинг, но за долгое время работы с Java у меня накопилась масса мыслей. Уверен, что они будут многим полезны, поэтому принимаю решение поделиться ими. Эти мысли зарождались у меня в самые разные периоды:
когда я мучительно пытался понять, как работает только что написанный код
во время холиварных споров с коллегами
и особенно в моменты дебага
https://habr.com/ru/articles/759102/
👉@BookJava
Я конечно не Джеймс Гослинг, но за долгое время работы с Java у меня накопилась масса мыслей. Уверен, что они будут многим полезны, поэтому принимаю решение поделиться ими. Эти мысли зарождались у меня в самые разные периоды:
когда я мучительно пытался понять, как работает только что написанный код
во время холиварных споров с коллегами
и особенно в моменты дебага
https://habr.com/ru/articles/759102/
👉@BookJava
👍1
Как прочитать байткод?
Байткод – аналог машинного кода для JVM. Он получается в результате компиляции исходного .java файла и хранится в .class файле. Анализ байткода иногда может помочь в исследовании бага, или лучше настроить производительность. Он необходим для отладки с инструментами динамической манипуляции байткодом, вроде ASM или BCEL.
Это бинарный код, и открыть его простым текстовым редактором не выйдет. В пакете утилит JDK доступен инструмент
Аргументами передается полное имя класса, и classpath в котором этот класс искать. По умолчанию отображаются только объявления публичных членов. Ключ
👉@BookJava
Байткод – аналог машинного кода для JVM. Он получается в результате компиляции исходного .java файла и хранится в .class файле. Анализ байткода иногда может помочь в исследовании бага, или лучше настроить производительность. Он необходим для отладки с инструментами динамической манипуляции байткодом, вроде ASM или BCEL.
Это бинарный код, и открыть его простым текстовым редактором не выйдет. В пакете утилит JDK доступен инструмент
javap
. Это утилита командной строки для чтения .class файлов.Аргументами передается полное имя класса, и classpath в котором этот класс искать. По умолчанию отображаются только объявления публичных членов. Ключ
-p
добавит приватные методы и поля; -v
выведет дополнительные метаданные; -c
отобразит сам байткод – скомпилированную реализацию методов.👉@BookJava
👍5🔥1
Параллельность в Java на практике
Как следует из названия, здесь будет только про параллельное выполнение (не путать с конкурентностью). Так же я не буду затрагивать проект Loom, который «должен убить» все остальные подходы написания параллельного кода. Надеюсь изложенное ниже позволит начинающим java программистам разобраться с разными подходами и структурировать имеющиеся знания.
https://habr.com/ru/articles/759054/
👉@BookJava
Как следует из названия, здесь будет только про параллельное выполнение (не путать с конкурентностью). Так же я не буду затрагивать проект Loom, который «должен убить» все остальные подходы написания параллельного кода. Надеюсь изложенное ниже позволит начинающим java программистам разобраться с разными подходами и структурировать имеющиеся знания.
https://habr.com/ru/articles/759054/
👉@BookJava
👍2
Совет
По умолчанию при обновлении сущности Hibernate обновляет все ее поля. Вы можете использовать аннотацию
👉@BookJava
По умолчанию при обновлении сущности Hibernate обновляет все ее поля. Вы можете использовать аннотацию
@DynamicUpdate
на объекте @Entity
и Hibernate будет обновлять только те столбцы, которые изменились.👉@BookJava
👍23👏1
Spring Boot ChatGPT Starter
Features
Base on Spring Boot 3.0+
Async with Spring Webflux
Support ChatGPT Chat Stream
Support ChatGPT functions: @ GPTFunction annotation
Prompt Management: load prompt templates from prompt.properties with @ PropertyKey, and friendly with IntelliJ IDEA
Prompt as Lambda: convert prompt template to lambda expression and call it with FP style
ChatGPT interface: Declare ChatGPT service interface with @ ChatGPTExchange and @ ChatCompletion annotations.
No third-party library: base on Spring 6 HTTP interface
GraalVM native image support
Azure OpenAI support
https://github.com/linux-china/chatgpt-spring-boot-starter
👉@BookJava
Features
Base on Spring Boot 3.0+
Async with Spring Webflux
Support ChatGPT Chat Stream
Support ChatGPT functions: @ GPTFunction annotation
Prompt Management: load prompt templates from prompt.properties with @ PropertyKey, and friendly with IntelliJ IDEA
Prompt as Lambda: convert prompt template to lambda expression and call it with FP style
ChatGPT interface: Declare ChatGPT service interface with @ ChatGPTExchange and @ ChatCompletion annotations.
No third-party library: base on Spring 6 HTTP interface
GraalVM native image support
Azure OpenAI support
https://github.com/linux-china/chatgpt-spring-boot-starter
👉@BookJava
GitHub
GitHub - linux-china/chatgpt-spring-boot-starter: Spring Boot ChatGPT Starter
Spring Boot ChatGPT Starter. Contribute to linux-china/chatgpt-spring-boot-starter development by creating an account on GitHub.
👍6
Динамическое создание слушателей в Kafka
План
Создадим шаблонный класс через реализацию интерфейса MessageListener.
Создадим KafkaListenerEndpoint с помощью шаблона.
Зарегестрируем эндпоинт в KafkaListenerEndpointRegistry.
Создадим окружение для тестирования.
Протестируем решение.
Заключение.
https://habr.com/ru/articles/758958/
👉@BookJava
План
Создадим шаблонный класс через реализацию интерфейса MessageListener.
Создадим KafkaListenerEndpoint с помощью шаблона.
Зарегестрируем эндпоинт в KafkaListenerEndpointRegistry.
Создадим окружение для тестирования.
Протестируем решение.
Заключение.
https://habr.com/ru/articles/758958/
👉@BookJava
👍4
Совет
В Hibernate 6 изменен способ чтения базового
👉@BookJava
В Hibernate 6 изменен способ чтения базового
JDBC
ResultSet
с чтения по имени на чтение по позиции. Благодаря этому изменению после обновления вы получите более чистые SQL-запросы без псевдонимов столбцов 👍.👉@BookJava
👍6
Управление памятью в Java: Введение
В языке Java управление памятью - это автоматический процесс, управляемый виртуальной машиной Java (JVM) и не требующий явного вмешательства. Java, будучи блочно-структурированным языком, использует модель, в которой память делится на два основных типа: стек и куча.
Локальные переменные и параметры методов используют память, основанную на "стеке". Эта область памяти автоматически увеличивается и уменьшается при входе и выходе из блока кода или метода соответственно. В ситуациях, когда системе запрашивается объем памяти, размер которого известен только во время выполнения программы или при создании объекта, эти запросы обычно удовлетворяются за счет области памяти процесса, называемой "динамической памятью" или "кучей". Строго говоря, бывает и так, что объект, предназначенный для кучи, записывается в стек, но мы оставим это обсуждение для более позднего документа.
https://foojay.io/today/java-memory-management/
👉@BookJava
В языке Java управление памятью - это автоматический процесс, управляемый виртуальной машиной Java (JVM) и не требующий явного вмешательства. Java, будучи блочно-структурированным языком, использует модель, в которой память делится на два основных типа: стек и куча.
Локальные переменные и параметры методов используют память, основанную на "стеке". Эта область памяти автоматически увеличивается и уменьшается при входе и выходе из блока кода или метода соответственно. В ситуациях, когда системе запрашивается объем памяти, размер которого известен только во время выполнения программы или при создании объекта, эти запросы обычно удовлетворяются за счет области памяти процесса, называемой "динамической памятью" или "кучей". Строго говоря, бывает и так, что объект, предназначенный для кучи, записывается в стек, но мы оставим это обсуждение для более позднего документа.
https://foojay.io/today/java-memory-management/
👉@BookJava