Java библиотека – Telegram
Java библиотека
31.5K subscribers
2.37K photos
89 videos
9 files
2.17K links
Книги, статьи, мемы и многое другое для Java программиста!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrT4A

Мы на бирже: https://telega.in/c/javalib/

Сообщество VK https://vk.com/javatutorial
Download Telegram
🖥 Вопрос с собеседования: Опишите жизненный цикл Spring Bean

Beans – центральный объект заботы Spring Framework. За кулисами фреймворка с ними происходит множество процессов. Во многие из них можно вмешаться, добавив собственную логику в разные этапы жизненного цикла. Через следующие этапы проходит каждый отдельно взятый бин:

1. Инстанцирование объекта. Техническое начало жизни бина, работа конструктора его класса;

2. Установка свойств из конфигурации бина, внедрение зависимостей;

3. Нотификация aware-интерфейсов. BeanNameAware, BeanFactoryAware и другие. Мы уже писали о таких интерфейсах ранее. Технически, выполняется системными подтипами BeanPostProcessor, и совпадает с шагом 4;

4. Пре-инициализация – метод postProcessBeforeInitialization() интерфейса BeanPostProcessor;

5. Инициализация. Разные способы применяются в таком порядке:
• Метод бина с аннотацией
@PostConstruct из стандарта JSR-250 (рекомендуемый способ);
• Метод afterPropertiesSet() бина под интерфейсом InitializingBean;
• Init-метод. Для отдельного бина его имя устанавливается в параметре определения initMethod. В xml-конфигурации можно установить для всех бинов сразу, с помощью default-init-method;

6. Пост-инициализация – метод postProcessAfterInitialization() интерфейса BeanPostProcessor.
Когда IoC-контейнер завершает свою работу, мы можем кастомизировать этап штатного уничтожения бина. Как со всеми способами финализации в Java, при жестком выключении (kill -9) гарантии вызова этого этапа нет. Три альтернативных способа «деинициализации» вызываются в том же порядке, что симметричные им методы инициализации:

1. Метод с аннотацией
@PreDestroy;
2. Метод с именем, которое указано в свойстве destroyMethod определния бина (или в глобальном default-destroy-method);
3. Метод destroy() интерфейса DisposableBean.

Не следует путать жизненный цикл отдельного бина с жизненным циклом контекста и этапами подготовки фабрик бинов. О них мы поговорим в будущих публикациях.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥109👍8
👩‍💻 AI for Java Developers: Full Course / Workshop on Getting Started with Spring AI

*Every Java Developer is now an AI Developer. Transform your Java skills for the AI era with this comprehensive 5.5-hour Spring AI masterclass!*

Are you a Java developer ready to harness the power of AI in your applications? This complete course takes you from AI fundamentals to building production-ready intelligent applications using Spring AI 1.0.


🌐🗣СМОТРЕТЬ VKVIDEO

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍108🔥4
Media is too big
VIEW IN TELEGRAM
Блокирующий TCP сервер на java

На простом примере посмотрим как можно реализовать блокирующий TCP сервер на java.

🌐🗣СМОТРЕТЬ VKVIDEO

📺🗣СМОТРЕТЬ RUTUBE

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍4🔥4
CyclicBarrier

CyclicBarrier (циклический барьер) — это один из механизмов синхронизации в языке программирования Java, предоставляемый пакетом java.util.concurrent. Он позволяет группе потоков синхронизироваться на определенной точке выполнения, после чего они могут продолжить выполнение параллельно.

CyclicBarrier представляет собой барьер, который блокирует выполнение всех потоков до тех пор, пока все потоки не достигнут этой точки. Как только все потоки достигли барьера, он разблокируется, и все потоки выполняют свою работу.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍12🔥4
Media is too big
VIEW IN TELEGRAM
Spring AI Tutorial Integrate ChatGPT with Spring Boot & OpenAI

In this hands-on Spring AI tutorial, you’ll learn how to integrate ChatGPT with Spring Boot and OpenAI's API. I walk you through every step to get started with generative AI in your Spring-based applications.

🌐🗣СМОТРЕТЬ VKVIDEO

📺🗣СМОТРЕТЬ RUTUBE

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍65🔥4
Как разделить строку на части?

В Java можно разделить строку на части с помощью метода split() класса String. Метод split() разбивает исходную строку на массив строк, используя заданный разделитель.

В этом примере исходная строка «Это пример строки для разделения» разбивается на части с помощью пробела в качестве разделителя. Однако, если у вас есть другой разделитель (например, запятая или точка с запятой), просто замените значение переменной delimiter на соответствующий разделитель в вашем случае.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍133🔥3😁2
🕯 Паттерн Command (Команда)

Command — это поведенческий паттерн, который превращает запросы в объекты, позволяя параметризировать методы другими запросами, ставить запросы в очередь или логировать их.

Использование:

🟢 Для отделения отправителя запроса от объекта, который выполняет действие, чтобы упростить изменение или отмену команд.
🟢 Для реализации очередей команд или их многоуровневой отмены.
🟢 Для логирования команд с возможностью их повторного выполнения.

Преимущества:


1️⃣ Инкапсуляция операций в отдельные объекты упрощает расширение системы. Это позволяет легко добавлять новые команды, не изменяя существующий код.
2️⃣ Command предоставляет гибкость в управлении действиями: их можно откладывать, отменять или хранить для последующего выполнения, что делает его полезным в сценариях с очередями задач или транзакциями.
3️⃣ Команды можно комбинировать, создавая макрокоманды для выполнения последовательностей операций, что упрощает выполнение сложных сценариев.
4️⃣ Реализует принцип открытости-закрытости: можно добавлять новые команды без изменения существующего кода.

Недостатки:

1️⃣ Необходимость хранения истории команд для их отмены может потребовать значительных ресурсов, что делает паттерн менее эффективным в системах с ограниченной памятью.
2️⃣ Добавление новых команд требует создания новых классов, что увеличивает объем работы и поддерживает сложность системы.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍147🔥3
Media is too big
VIEW IN TELEGRAM
Неблокирующий TCP сервер на java (NIO)

В предыдущем видео Блокирующий TCP сервер на java мы посмотрели как можно реализовать блокирующий сервер.
Сейчас давайте взглянем на неблокирующий вариант TCP сервера на java.


🌐🗣СМОТРЕТЬ VKVIDEO

📺🗣СМОТРЕТЬ RUTUBE

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74🔥3
Конвертируем массив в список

Arrays.asList() — это статический метод класса Arrays, который позволяет конвертировать обычный массив в список List.

— Принимает массив в качестве аргумента и возвращает объект типа List с элементами этого массива.

— Возвращаемый список имеет фиксированный размер, равный длине исходного массива. Добавлять/удалять элементы в него нельзя.

— Изменения в возвращаемом списке будут вноситься в исходный массив, т. к. список работает как «представление» массива. Метод работает для массивов примитивных и ссылочных типов.

Arrays.asList хорош для чтения элементов массива, но не для записи из-за неизменяемого размера.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
15👍5🔥5
ℹ️ Метод-референсы

В Java 8 появился новый способ улучшить читаемость кода — ссылки на методы. Это позволяет ссылаться на существующие методы без их вызова, делая код более кратким и понятным.

🔍 Типы метод-референсов:

1️⃣ Статические методы: Позволяют ссылаться на статические методы класса.
Пример: Integer::parseInt

2️⃣ Методы экземпляра: Ссылки на методы конкретного объекта.
Пример: myObject::toString

3️⃣ Методы любого объекта типа: Для методов любого экземпляра заданного класса.
Пример: String::toUpperCase

4️⃣ Конструкторы: Ссылки на конструкторы для создания новых объектов.
Пример: ArrayList::new

⚡️ Пример использования:

Вместо стандартной лямбды:

list.forEach(item -> System.out.println(item));


Можно использовать ссылку на метод:

list.forEach(System.out::println);


А Вы используете ссылки на методы в своих проектах?👇

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
22👍8🔥2
Java. Рекурсия и цикл.

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

📺🗣СМОТРЕТЬ RUTUBE

🌐🗣СМОТРЕТЬ VKVIDEO
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥74👍3
Что такое REST?

REST (Representational State Transfer) — это архитектурный стиль предоставляющий стандарты для взаимодействия в распределённых системах. Он базируется на простоте, понятности и использует стандартные HTTP методы для взаимодействия между клиентом и сервером. Рой Филдинг впервые представил его в 2000 году в своей знаменитой диссертации. REST очень популярен, так как его легко реализовать, поддерживать и масштабировать.

❗️ Основные принципы REST

🔵 Единый интерфейс: каждый метод должен чётко выполнять свою задачу — например, GET для чтения, POST для создания.
🔵 Без сохранения состояния (stateless): каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для понимания запроса, и не должен использовать какой-либо сохраненный контекст на сервере.
🔵 Архитектура клиент-сервер: чёткое разделение интерфейсов, сервер отвечает за обработку данных, клиент — за их представление.
🔵 Кэширование: сервер имеет право повторно использовать данные ответа позднее для эквивалентных запросов и в течение указанного периода.
🔵 Слои: архитектура может состоять из нескольких слоёв, где каждый слой имеет своё предназначение и не зависит от других.
🔵 Код по запросу (опционально): сервер может отправлять исполняемый код клиенту для улучшения его функциональности (например, скрипты).

⚙️ Основные HTTP-методы

▪️ GET — используется для получения данных. Например, запрос всех пользователей:
GET /users

▪️ POST — создаёт новый ресурс. Например, добавление нового пользователя:
POST /users
{
"name": "John",
"age": 30
}

▪️ PUT — обновляет ресурс. Например, обновление информации о пользователе:
PUT /users/1
{
"name": "John Doe",
"age": 31
}

▪️ PATCH — частично обновляет ресурс. Например, изменение email пользователя:
PATCH /users/1
{
"email": "john.new@example.com"
}

▪️ DELETE — удаляет ресурс. Например, удаление пользователя:
DELETE /users/1


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥76
StringBuffer

StringBuffer — это класс, предназначенный для работы со строками. Он позволяет создавать модифицируемые (изменяемые) строки.

В отличие от класса String, объекты StringBuffer можно изменять после их создания, используя различные методы, такие как append(), insert(), delete().
Также StringBuffer эффективнее String при частых изменениях строки, так как не создает новый объект при каждом изменении.

Класс является потокобезопасным, т. е. может использоваться в многопоточных приложениях.

Методы StringBuffer не синхронизированы, поэтому для многопоточного доступа нужно вручную синхронизировать доступ с помощью synchronized блока.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥8👍4😁3
🕯 Паттерн Decorator (Декоратор)

Decorator — это структурный паттерн, который позволяет динамически добавлять объектам новые обязанности, оборачивая их в "декораторы". Это полезно для расширения функциональности без изменения существующего кода.

Использование:

🟢 Для динамического добавления поведения объектам без изменения их кода.
🟢 Для разделения функциональности на отдельные классы, чтобы избежать создания монолитных классов с множеством обязанностей.
🟢 Когда нужно добавлять новые функции не только для одного объекта, но и для всех его потомков.

Преимущества:

1️⃣ Паттерн позволяет гибко расширять поведение объектов на лету, не изменяя исходный код класса.
2️⃣ Устраняет необходимость создавать громоздкие подклассы с множеством вариаций, что уменьшает сложность системы.
3️⃣ Позволяет комбинировать несколько декораторов, чтобы получить более сложные поведения, сохраняя при этом структуру системы простой и модульной.
4️⃣ Реализует принцип единственной ответственности: каждая новая функциональность инкапсулируется в отдельный класс-декоратор.

Недостатки:

1️⃣ Усложнение отладки программы, так как наличие множества обёрток может затруднять понимание того, где и как обрабатываются запросы.
2️⃣ Создание большого числа мелких объектов-декораторов, что может увеличить потребление памяти и усложнить структуру системы.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍10🔥6
Запуск Java SpringBoot + MySQL в Docker | Dockerfile + Docker compose

В этом видео я покажу, как запустить Spring Boot приложение с базой данных MySQL в Docker. Мы будем использовать Dockerfile для сборки приложения и Docker Compose для управления контейнерами. Это пошаговое руководство поможет вам быстро настроить среду разработки и развернуть приложение локально.

📺🗣СМОТРЕТЬ RUTUBE

🌐🗣СМОТРЕТЬ VKVIDEO
Please open Telegram to view this post
VIEW IN TELEGRAM
👍113🔥3😁2
🕯 Паттерн Iterator (Итератор)

Iterator — это поведенческий паттерн, который позволяет последовательно обходить элементы коллекции, не раскрывая ее внутреннюю структуру. Он обеспечивает единый интерфейс для работы с различными типами коллекций.

Использование:

🟢Когда нужно обеспечить единый способ обхода элементов коллекций без зависимости от их типа.
🟢Когда нужно скрыть внутреннюю реализацию структуры данных от кода, который с ней работает.
🟢Для реализации паттерна "агрегат" и отделения итерации от логики самой коллекции.

Преимущества:

1️⃣ Упрощает работу с коллекциями, позволяя обходить их элементы через единый интерфейс, независимо от внутренней структуры.
2️⃣ Реализует принцип единственной ответственности, отделяя логику обхода от структуры данных.
3️⃣ Упрощает добавление новых способов обхода коллекции без изменения её кода.

Недостатки:

1️⃣ Могут возникать сложности при синхронизации, если коллекция изменяется в процессе итерации.
2️⃣ Может потребоваться создание множества различных классов итераторов для каждого типа коллекции, что увеличивает сложность системы.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍6🔥4
System.nanoTime

System.nanoTime() возвращает текущее время в наносекундах.

Этот метод используется для измерения продолжительности выполнения небольших фрагментов кода.

В отличие от System.currentTimeMillis(), который возвращает время в миллисекундах, nanoTime() имеет более высокое разрешение и позволяет измерять очень короткие промежутки времени.

nanoTime() часто используется для:

— Замеров производительности.
— Измерения задержек в мультитрединге.
— Микробенчмаркинга.
— Определения интервалов между событиями в реальном времени.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍104🔥3
🔑 Encoding vs Encryption vs Tokenization: основные отличия

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

🟢Кодирование
Кодирование переводит данные в другой формат по легко обратимой схеме. Например, Base64 кодирует бинарные данные в текстовый формат для упрощения передачи через текстовые каналы. Кодирование не обеспечивает защиту данных, так оно легко обратимо без ключа.

🟢Шифрование
Шифрование преобразует данные с помощью алгоритмов и ключей. Бывает симметричным (один ключ) и асимметричным (разные ключи). Оно защищает данные, превращая их в нечитаемый формат, который можно расшифровать только с правильным ключом.

🟢Токенизация
Токенизация заменяет чувствительные данные безопасными токенами, связь которых с оригиналом хранится в защищенном хранилище. Токены используются в системах без риска утечки данных и полезны для соблюдения стандартов, таких как PCI DSS.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥54
Метод Math.random()

Используется для генерации случайного числа в диапазоне от 0.0 до 1.0. Различные диапазоны могут быть достигнуты с помощью арифметики.

Выше приведен пример выбора случайного числа в диапазоне от 0 до 10.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍115🔥3😁2
🕯 Паттерн Observer (Наблюдатель)

Observer — это поведенческий паттерн, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на изменения состояния других объектов. Наблюдатель предоставляет гибкую систему взаимодействия между объектами, исключая жесткую связанность.

Использование:

🟢Когда нужно оповещать несколько объектов об изменениях состояния другого объекта.
🟢Когда важно обеспечить слабую связанность между компонентами системы.
🟢При разработке систем, где одни объекты должны реагировать на изменения в других, без жёсткой привязки.

Преимущества:

1️⃣ Обеспечивает слабую связанность между объектами.
2️⃣ Упрощает динамическое добавление новых наблюдателей без изменения кода субъекта.
3️⃣ Позволяет множеству объектов реагировать на события.

Недостатки:

1️⃣ Может приводить к большим накладным расходам при большом количестве наблюдателей.
2️⃣ Потенциальная сложность отладки из-за непредсказуемого порядка оповещения.
3️⃣ Может возникнуть ситуация, когда наблюдатели получают неконсистентное состояние.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍5🔥5
🤯 Зачем велосипеду Kafka?

Команда Яндекс Еды опубликовала мощный лонгрид о разработке своего умного электровелосипеда. Главная фишка — можно прямо в браузере покрутить детализированную 3D-модель и кликнуть на любой узел, от IoT-модуля до батареи, чтобы прочитать, как он устроен.

Что интересного в самой статье:

Как справляются с потоком в 10 000 сообщений в секунду от тысяч велосипедов, используя связку MQTT и Kafka.
Как байк определяет свою геолокацию без GPS и как курьер может разблокировать его по Bluetooth, если пропал интернет.
Как устроен весь пайплайн: от IoT-модуля на самом велосипеде до облачных сервисов и интеграции с приложением Яндекс Про.

Отличный кейс для всех, кто работает с IoT и высоконагруженными системами.
9🔥6👍2