Для запуска приложения в докере понадобится установленный Docker и приложение собранное в jar файл.
Для создания docker образа (image), на основе которого будет создаваться контейнер с вашим приложением, нужен файл с именем Dockerfile.
В этом файле должны быть 3 простые директивы:
FROM: указывает родительский образ, из которого мы создаем свой.
ADD: копируем jar файл внутрь образа
ENTRYPOINT: запуск команды после старта контейнера
Далее нужно собрать образ командой:
docker build -t my-java-app .И запустить контейнер на основе созданного образа:
docker run -p 8080:8080 my-java-appЭта команда запустит контейнер, привяжет порт 8080 в контейнере к порту 8080 на хосте и запустит ваше Java-приложение внутри контейнера.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍6🐳5
QueryDSL — это мощный и чрезвычайно гибкий инструмент для работы с БД и просто подарок для Java-разработчиков, которые не очень хорошо разбираются в SQL (или совсем не разбираются), поскольку позволяет работать с БД при помощи привычного объектного представления сущностных зависимостей.
Querydsl был создан как замена громоздкого и многословного Criteria Query API.
Достоинства:
👉 типобезопасные запросы
👉 статическая проверка запросов
Querydsl был создан как замена громоздкого и многословного Criteria Query API.
Достоинства:
👉 типобезопасные запросы
👉 статическая проверка запросов
👍20👌1
Часто в Java-приложении есть необходимость хранить файлы. И если приложение состоит из нескольких микросервисов, которым нужен доступ к файлам, то не обойтись без централизованного файлового хранилища. Одним из таких хранилищ является MinIO.
MinIO - это open source хранилище данных, совместимое с Amazon S3. Он обеспечивает отказоустойчивость, масштабируемость, шифрование данных и предоставляет богатые клиентские библиотеки для интеграции в приложения.
MinIO становится популярным выбором для хранения и управления данными благодаря своей гибкости и совместимости с Amazon S3, что делает его подходящим для широкого спектра приложений, от простых хранилищ данных до сложных облачных сценариев.
MinIO - это open source хранилище данных, совместимое с Amazon S3. Он обеспечивает отказоустойчивость, масштабируемость, шифрование данных и предоставляет богатые клиентские библиотеки для интеграции в приложения.
MinIO становится популярным выбором для хранения и управления данными благодаря своей гибкости и совместимости с Amazon S3, что делает его подходящим для широкого спектра приложений, от простых хранилищ данных до сложных облачных сценариев.
👍6🔥3🤗1
ACID (Atomicity, Consistency, Isolation, Durability) - это набор свойств, которые определяют стандарты для транзакций в базах данных. Эти свойства обеспечивают надежность и целостность данных в базе данных, даже в случае сбоев системы или непредвиденных ситуаций. Давайте рассмотрим каждое из этих свойств более подробно:
1⃣ Атомарность (Atomicity): Это свойство гарантирует, что транзакция будет выполнена полностью или не будет выполнена вовсе. Она является неделимой единицей работы, и либо все её операции будут успешно завершены, либо ни одна из них. Если хотя бы одна операция в транзакции завершится неудачно, все изменения, внесенные этой транзакцией, будут отменены (откат).
2⃣ Согласованность (Consistency): Это свойство обеспечивает, что только допустимые данные могут быть записаны в базу данных. Транзакция не должна нарушать целостность данных и бизнес-правила. Если транзакция приводит к недопустимому состоянию данных, она будет отменена.
3⃣ Изолированность (Isolation): Изоляция гарантирует, что одна транзакция не влияет на другие транзакции, выполняющиеся параллельно. То есть, каждая транзакция должна работать так, как будто она выполняется в изоляции от других транзакций. Это предотвращает конфликты и гарантирует, что данные не будут испорчены параллельными операциями.
4⃣ Долговечность (Durability): Долговечность означает, что изменения, внесенные в базу данных в рамках успешно завершенной транзакции, должны быть сохранены даже в случае сбоя системы или перезапуска. Другими словами, данные, записанные в базу данных, должны быть стойкими к сбоям и не должны теряться.
📌 Соблюдение этих четырех принципов ACID является критически важным для обеспечения надежности и целостности данных в системах управления базами данных (СУБД). Эти принципы позволяют гарантировать, что даже в сложных сценариях, таких как сбои системы или конфликты параллельных транзакций, данные останутся в согласованном и надежном состоянии.
1⃣ Атомарность (Atomicity): Это свойство гарантирует, что транзакция будет выполнена полностью или не будет выполнена вовсе. Она является неделимой единицей работы, и либо все её операции будут успешно завершены, либо ни одна из них. Если хотя бы одна операция в транзакции завершится неудачно, все изменения, внесенные этой транзакцией, будут отменены (откат).
2⃣ Согласованность (Consistency): Это свойство обеспечивает, что только допустимые данные могут быть записаны в базу данных. Транзакция не должна нарушать целостность данных и бизнес-правила. Если транзакция приводит к недопустимому состоянию данных, она будет отменена.
3⃣ Изолированность (Isolation): Изоляция гарантирует, что одна транзакция не влияет на другие транзакции, выполняющиеся параллельно. То есть, каждая транзакция должна работать так, как будто она выполняется в изоляции от других транзакций. Это предотвращает конфликты и гарантирует, что данные не будут испорчены параллельными операциями.
4⃣ Долговечность (Durability): Долговечность означает, что изменения, внесенные в базу данных в рамках успешно завершенной транзакции, должны быть сохранены даже в случае сбоя системы или перезапуска. Другими словами, данные, записанные в базу данных, должны быть стойкими к сбоям и не должны теряться.
📌 Соблюдение этих четырех принципов ACID является критически важным для обеспечения надежности и целостности данных в системах управления базами данных (СУБД). Эти принципы позволяют гарантировать, что даже в сложных сценариях, таких как сбои системы или конфликты параллельных транзакций, данные останутся в согласованном и надежном состоянии.
👍15🆒2❤1🔥1
Скачать файл используя Java NIO
Пакет Java NIO предлагает возможность передавать байты между двумя каналами без их буферизации в памяти приложения.
Чтобы прочитать файл по нашему URL-адресу, мы создадим новый
Байты, прочитанные из
Используем метод
Методы
В системах Linux и UNIX эти методы используют метод нулевого копирования, который уменьшает количество переключений контекста между режимом ядра и пользовательским режимом.
Пакет Java NIO предлагает возможность передавать байты между двумя каналами без их буферизации в памяти приложения.
Чтобы прочитать файл по нашему URL-адресу, мы создадим новый
ReadableByteChannel из потока URL-адреса.Байты, прочитанные из
ReadableByteChannel, будут переданы в FileChannel, соответствующий загружаемому файлу.Используем метод
transferFrom() из класса ReadableByteChannel для загрузки байтов с заданного URL-адреса в наш FileChannel.Методы
transferTo() и transferFrom() более эффективны, чем простое чтение из потока с использованием буфера. В зависимости от операционной системы данные могут быть перенесены непосредственно из кэша файловой системы в наш файл без копирования каких-либо байтов в память приложения.В системах Linux и UNIX эти методы используют метод нулевого копирования, который уменьшает количество переключений контекста между режимом ядра и пользовательским режимом.
👍15🔥1
StringJoiner - это класс, который предназначен для объединения строк с использованием разделителя между ними. Этот класс был введен в Java 8 в пакете java.util. Он облегчает создание текстовых последовательностей, объединяя строки и вставляя разделители между ними.
Вызов метода
Вы также можете использовать метод
Вызов метода
toString() возвращает объединенную строку с разделителями и окружающими символами.Вы также можете использовать метод
setEmptyValue() для определения значения, которое будет использоваться, если StringJoiner остается пустым.👍15❤3🔥1
Способы передачи параметров
В языках программирования существует два основных способа передачи параметров в методы (или функции) — "по значению" и "по ссылке". Эти методы определяют, каким образом изменения, внесенные в параметр внутри метода, влияют на исходное значение аргумента, переданного методу. Рассмотрим оба способа более подробно.
1⃣ Передача параметра "по значению" (pass-by-value):
В этом способе исходное значение параметра не изменяется внутри метода. Метод работает с копией значения параметра. Это означает, что любые изменения, внесенные в параметр внутри метода, не отразятся на исходном значении, переданном методу. Параметры передаются "по значению" в большинстве простых типов данных.
2⃣ Передача параметра "по ссылке" (pass-by-reference):
В этом случае метод получает не копию значения параметра, а ссылку на сам объект или переменную. Если метод изменяет значение параметра, это изменение отразится на исходном объекте или переменной, переданной методу. Параметры передаются "по ссылке" в языках программирования, поддерживающих ссылки на объекты, как например в языке C++ с использованием указателей.
Понимание разницы между передачей параметра "по значению" и "по ссылке" важно для правильной работы и отладки программ. В разных языках программирования могут быть разные правила для передачи параметров, поэтому важно знать, какой механизм используется в конкретном языке.
В Java передача всегда происходит "по значению", то есть содержимое переменной копируется при передаче в метод. Но важно понимать, что при передаче переменной ссылочного типа (любой не примитивный тип), скопируется именно ссылка на объект (а не сам объект) и соответственно в методе можно поменять сам исходный (переданный) объект.
В языках программирования существует два основных способа передачи параметров в методы (или функции) — "по значению" и "по ссылке". Эти методы определяют, каким образом изменения, внесенные в параметр внутри метода, влияют на исходное значение аргумента, переданного методу. Рассмотрим оба способа более подробно.
1⃣ Передача параметра "по значению" (pass-by-value):
В этом способе исходное значение параметра не изменяется внутри метода. Метод работает с копией значения параметра. Это означает, что любые изменения, внесенные в параметр внутри метода, не отразятся на исходном значении, переданном методу. Параметры передаются "по значению" в большинстве простых типов данных.
2⃣ Передача параметра "по ссылке" (pass-by-reference):
В этом случае метод получает не копию значения параметра, а ссылку на сам объект или переменную. Если метод изменяет значение параметра, это изменение отразится на исходном объекте или переменной, переданной методу. Параметры передаются "по ссылке" в языках программирования, поддерживающих ссылки на объекты, как например в языке C++ с использованием указателей.
Понимание разницы между передачей параметра "по значению" и "по ссылке" важно для правильной работы и отладки программ. В разных языках программирования могут быть разные правила для передачи параметров, поэтому важно знать, какой механизм используется в конкретном языке.
В Java передача всегда происходит "по значению", то есть содержимое переменной копируется при передаче в метод. Но важно понимать, что при передаче переменной ссылочного типа (любой не примитивный тип), скопируется именно ссылка на объект (а не сам объект) и соответственно в методе можно поменять сам исходный (переданный) объект.
👍10🔥3
👍8🏆4🥰3
Принцип программирования KISS - это акроним, который расшифровывается как "Keep It Simple, Stupid" или более корректно "Keep It Short and Simple". Этот принцип представляет собой философию, которая подразумевает, что программное обеспечение должно быть создано и поддерживаться с максимальной простотой, чтобы быть более надежным, легко понимаемым и легко изменяемым.
Принцип KISS означает, что разработчики должны избегать излишней сложности, лишних функций, и сложных алгоритмов, если это не обосновано конкретными потребностями проекта. Простое программное обеспечение обычно более надежно и проще для сопровождения и масштабирования.
Принцип KISS часто связывают с другими принципами разработки, такими как "Принцип YAGNI" (You Ain't Gonna Need It), который призывает избегать добавления функций, которые пока не являются необходимыми, и "Принцип Occam's Razor", который гласит, что "простейшее объяснение, как правило, является наилучшим". Эти принципы способствуют созданию более чистого, эффективного и понятного кода.
Принцип KISS означает, что разработчики должны избегать излишней сложности, лишних функций, и сложных алгоритмов, если это не обосновано конкретными потребностями проекта. Простое программное обеспечение обычно более надежно и проще для сопровождения и масштабирования.
Принцип KISS часто связывают с другими принципами разработки, такими как "Принцип YAGNI" (You Ain't Gonna Need It), который призывает избегать добавления функций, которые пока не являются необходимыми, и "Принцип Occam's Razor", который гласит, что "простейшее объяснение, как правило, является наилучшим". Эти принципы способствуют созданию более чистого, эффективного и понятного кода.
👍12🔥4❤3
Arrays.toString() и Arrays.deepToString()
В Java массивы не переопределяют
Но обычно нам на самом деле нужно что бы напечаталось содержимое массива. Самый простой способ это сделать, это воспользоваться методом
Внутри этих методов на каждом элементе массива вызывается метод
В Java массивы не переопределяют
toString(), поэтому, если вы попытаетесь напечатать его напрямую, вы получите имя класса + '@' + шестнадцатеричный хеш-код массива, как определено в Object.toString().Но обычно нам на самом деле нужно что бы напечаталось содержимое массива. Самый простой способ это сделать, это воспользоваться методом
Arrays.toString(). А если массив содержит другие массивы, то Arrays.deepToString().Внутри этих методов на каждом элементе массива вызывается метод
toString() для получения строкового представления.👍24🔥4👌3
Immutable Classes (неизменяемые классы)
Неизменяемость — это характеристика объектов Java, которая делает их неизменными для будущих изменений после их инициализации. Его внутреннее состояние невозможно никак изменить. Чтобы изменить состояние, мы должны создать новую копию такого объекта с предполагаемыми изменениями.
Возьмем пример класса
Рекомендации по созданию неизменяемых классов:
⌨️ Не определять сеттеров. Сеттеры предназначены для изменения состояния объекта, которое мы здесь хотим предотвратить.
⌨️ Сделайте все поля final и private. Поля, объявленные
⌨️ Не позволяйте подклассам переопределять методы. Самый простой способ — объявить класс как
⌨️ Особое внимание "неизменяемым классам с изменяемыми полями". Всегда помните, что поля-члены могут быть либо изменяемыми, либо неизменяемыми. Значения неизменяемых членов (примитивы, классы-обёртки, строки и т. д.) могут быть безопасно возвращены из геттеров. Для изменяемых членов (POJO, коллекций и т. д.) мы должны скопировать содержимое в новый объект перед возвратом из геттера.
Некоторые неизменяемые классы из JDK:
👉
👉
👉
👉
👉
👉
Неизменяемость — это характеристика объектов Java, которая делает их неизменными для будущих изменений после их инициализации. Его внутреннее состояние невозможно никак изменить. Чтобы изменить состояние, мы должны создать новую копию такого объекта с предполагаемыми изменениями.
Возьмем пример класса
java.lang.String, который является неизменяемым классом. После создания строки мы не сможем изменить содержимое этой строки. Каждый общедоступный API в классе String возвращает новую строку с измененным содержимым. Исходная строка всегда остается неизменной.Рекомендации по созданию неизменяемых классов:
private, не будут доступны за пределами класса, и если сделать их final, мы не сможем изменить их даже случайно.final. final классы не могут быть расширены.Некоторые неизменяемые классы из JDK:
👉
String👉
Integer, Long, Double и другие обёртки👉
BigInteger, BigDecimal👉
enum👉
record👉
LocalDate, LocalTime и другие классы Java 8 Date Time APIPlease open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥5
Apache POI представляет собой API, который позволяет использовать файлы MS Office в Java приложениях. Данная библиотека разрабатывается и распространяется Apache Software Foundation и носит открытый характер. Apache POI включает классы и методы для чтения и записи информации в документы MS Office.
👍13🔥2
Класс Scanner представляет собой инструмент для считывания данных из различных источников, таких как стандартный ввод (клавиатура), файлы и строки. Он является частью пакета
Основные методы и возможности класса Scanner включают:
1️⃣ Считывание различных типов данных:
2️⃣ Управление разделителями: метод
3️⃣ Проверка наличия данных: методы
4️⃣ Обработка исключений: методы
Класс Scanner позволяет удобно считывать и обрабатывать ввод от пользователя или из файлов, что делает его полезным инструментом при создании интерактивных приложений и обработке входных данных.
java.util, и используется для обработки ввода данных в приложениях.Основные методы и возможности класса Scanner включают:
1️⃣ Считывание различных типов данных:
nextInt(), nextLong(), nextDouble() считывают числа, а next() и nextLine() считывают строки.2️⃣ Управление разделителями: метод
useDelimiter(String pattern) позволяет настроить пользовательский разделитель для ввода, по умолчанию Scanner использует пробелы как разделители.3️⃣ Проверка наличия данных: методы
hasNextInt(), hasNextDouble(), hasNext() позволяют проверить наличие следующего значения определенного типа во входных данных.4️⃣ Обработка исключений: методы
nextInt(), nextDouble() и другие могут вызвать исключения типа InputMismatchException, если ввод не соответствует ожидаемому типу данных.Класс Scanner позволяет удобно считывать и обрабатывать ввод от пользователя или из файлов, что делает его полезным инструментом при создании интерактивных приложений и обработке входных данных.
👍18🔥4👌1
В Java цикл for-each позволяет перебирать элементы массивов, коллекций и других итерируемых объектов без необходимости использовать индексы или итераторы. Однако, для того чтобы вы могли использовать for-each для перебора элементов своего собственного класса, этот класс должен реализовать интерфейс
В результате можно использовать for-each для перебора элементов этого класса, как если бы это был обычный массив или коллекция.
Вы можете адаптировать этот пример для своих собственных классов, реализуя интерфейс
Iterable и предоставить метод iterator(), возвращающий объект, реализующий интерфейс Iterator.В результате можно использовать for-each для перебора элементов этого класса, как если бы это был обычный массив или коллекция.
Вы можете адаптировать этот пример для своих собственных классов, реализуя интерфейс
Iterable и предоставив соответствующий итератор, чтобы использовать for-each для вашего класса.👍20👏2
Наследование конструкторов
В Java конструкторы не наследуются в том смысле, в котором наследуются методы и поля. Конструкторы - это специальные методы, используемые для инициализации объектов класса, и они не наследуются автоматически от суперкласса.
Однако в подклассе вы можете вызвать конструктор суперкласса с помощью ключевого слова
Таким образом, если вы хотите в подклассе сохранить все конструкторы суперкласса, то их нужно явно объявить в подклассе.
В Java конструкторы не наследуются в том смысле, в котором наследуются методы и поля. Конструкторы - это специальные методы, используемые для инициализации объектов класса, и они не наследуются автоматически от суперкласса.
Однако в подклассе вы можете вызвать конструктор суперкласса с помощью ключевого слова
super. Это позволяет вам использовать конструкторы суперкласса для инициализации наследуемых полей и выполнения дополнительных операций, связанных с наследованием.Таким образом, если вы хотите в подклассе сохранить все конструкторы суперкласса, то их нужно явно объявить в подклассе.
👍14🔥1👏1
Java 9 ввел важное изменение в структуру приложений — модульную систему Java (Java Platform Module System, JPMS). Эта система была внедрена для улучшения масштабируемости, обеспечения лучшей изоляции и повышения устойчивости приложений. Вот основные концепции модульной системы:
1️⃣ Модуль (Module): Модуль в Java представляет собой логическую группу пакетов, которая обеспечивает определенный уровень инкапсуляции. Модули позволяют явно определить, какие классы или пакеты являются открытыми для других модулей, а какие остаются внутренними (закрытыми).
2️⃣ Декларация модуля (Module Declaration): Файл module-info.java добавляется в корневой каталог модуля и содержит информацию о модуле, такую как его имя, зависимости от других модулей и экспортируемые пакеты.
3️⃣ Команды модулей (Module Commands): Java 9 ввела новые команды, связанные с модулями, такие как --module-path для указания пути к модульным файлам, и --module для запуска конкретного модуля.
4️⃣ Проекции модулей (Module Resolutions): Модульная система предоставляет новый механизм разрешения зависимостей между модулями, что делает управление зависимостями более эффективным.
5️⃣ Системные модули (System Modules): Java 9 включает ряд системных модулей, таких как
Использование модульной системы в Java позволяет более четко определять зависимости и предоставляет механизмы для управления видимостью классов и пакетов. Это сделано с целью сделать код более чистым, безопасным и удобным для поддержки в больших проектах.
1️⃣ Модуль (Module): Модуль в Java представляет собой логическую группу пакетов, которая обеспечивает определенный уровень инкапсуляции. Модули позволяют явно определить, какие классы или пакеты являются открытыми для других модулей, а какие остаются внутренними (закрытыми).
2️⃣ Декларация модуля (Module Declaration): Файл module-info.java добавляется в корневой каталог модуля и содержит информацию о модуле, такую как его имя, зависимости от других модулей и экспортируемые пакеты.
3️⃣ Команды модулей (Module Commands): Java 9 ввела новые команды, связанные с модулями, такие как --module-path для указания пути к модульным файлам, и --module для запуска конкретного модуля.
4️⃣ Проекции модулей (Module Resolutions): Модульная система предоставляет новый механизм разрешения зависимостей между модулями, что делает управление зависимостями более эффективным.
5️⃣ Системные модули (System Modules): Java 9 включает ряд системных модулей, таких как
java.base, java.sql, и другие, которые предоставляют основные библиотеки и функциональность.Использование модульной системы в Java позволяет более четко определять зависимости и предоставляет механизмы для управления видимостью классов и пакетов. Это сделано с целью сделать код более чистым, безопасным и удобным для поддержки в больших проектах.
👍12🔥2❤1🥰1👏1