java update

This commit is contained in:
Struchkov Mark 2024-10-19 09:43:09 +03:00
parent f01dc801c0
commit ab46572c61
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C
28 changed files with 290 additions and 13 deletions

View File

@ -0,0 +1,33 @@
---
aliases:
- бизнес-логике
tags:
- maturity/🌱
date: 2024-10-16
zero-link:
parents:
linked:
---
Бизнес-логика — это совокупность правил, процессов и операций, которые определяют, как бизнес-приложение или [[Информационная система|система]] обрабатывает данные и выполняет свои функции в соответствии с требованиями бизнеса. Она описывает последовательность действий, условия и правила, которые управляют поведением системы при выполнении бизнес-задач.
Основные аспекты бизнес-логики:
- **Правила и ограничения**: Определяют, что можно и нельзя делать в системе.
- **Процессы и операции**: Описывают последовательность шагов для достижения определенного результата.
- **Валидация данных**: Проверяет корректность и целостность вводимых или обрабатываемых данных.
- **Взаимодействие с данными**: Определяет, как данные создаются, читаются, обновляются и удаляются.
Бизнес-логика отделена от пользовательского интерфейса и технической инфраструктуры, что позволяет легко вносить изменения в систему при изменении бизнес-требований без необходимости переписывать всю программу.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-16]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -17,7 +17,7 @@ linked:
- Сетевой ввод-вывод. Обычно сводится к общению с [Rеverse proxy](Rеverse%20proxy.md) прием http-запроса и ответ на него, и со всевозможными сервисами, которые хранят данные это могут быть БД, очереди, memcaсhed и т.п.
- Склеивание строк сериализовать данные в JSON, сформировать шаблон на основе html, посчитать sh1 или md5? выполнить сжатие данных.
А что такое бизнес-логика в бэкенде? Это проверки наподобие "если значение переменных больше 3-х, делай это", "если пользователь авторизован, покажи одно, если не авторизован покажи другое". Бывают, конечно, отдельные задачи, например, по изменению размера картинки, преобразования видео, но чаще всего такие задачи решаются вне бэкенда с использованием очередей, воркеров и т.д.
А что такое [[бизнес-логика]] в бэкенде? Это проверки наподобие "если значение переменных больше 3-х, делай это", "если пользователь авторизован, покажи одно, если не авторизован покажи другое". Бывают, конечно, отдельные задачи, например, по изменению размера картинки, преобразования видео, но чаще всего такие задачи решаются вне бэкенда с использованием очередей, воркеров и т.д.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]]

43
dev/java/JDeps.md Normal file
View File

@ -0,0 +1,43 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-10-15
zero-link:
parents:
linked:
---
JDeps — это инструмент для анализа зависимостей модулей и пакетов, который был введён в [[../../../../knowledge/dev/java/JDK 8|JDK 8]], ещё до появления модульной системы [[Java Platform Module System|JPMS]]. Основная задача JDeps — помочь разработчикам понять, как модули и пакеты связаны друг с другом внутри проекта.
Основные возможности:
- Показывает, какие модули используются в проекте, какие зависимости между ними существуют и какие модули вызывают друг друга.
- Позволяет анализировать, какие библиотеки и классы реально используются, что помогает очищать проект от лишних зависимостей
Пример запуска Jdeps
```bash
jdeps --multi-release 17 --ignore-missing-deps -q -recursive --print-module-deps -cp 'project-core/build/lib/boot/*':'project-core/build/lib/main/*':'project-core/build/app/*' project-core/build/app/*
Output:
jdk.zipfs,jdk.management,jdk.crypto.cryptoki,java.security.jgss,jdk.crypto.ec
```
- `--multi-release 17`: указывает на использование многоверсионного JAR-файла для JDK 17, что позволяет учитывать разные версии классов для разных версий JDK.
- `--ignore-missing-deps`: игнорирует отсутствующие зависимости, чтобы избежать ошибок при их отсутствии.
- `-q`: отключает подробный вывод, что делает команду менее «шумной» и оставляет только ключевые данные.
- `-recursive`: указывает JDeps анализировать зависимости всех модулей рекурсивно.
- `--print-module-deps`: выводит список всех модулей, которые требуются для работы проекта.
- `-cp`: указывает путь к классам и библиотекам проекта.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-15]]
**Автор**::
### Дополнительные материалы
- [[JLink]]
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

55
dev/java/JLink.md Normal file
View File

@ -0,0 +1,55 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-10-15
zero-link:
parents:
linked:
---
JLink — это мощный инструмент, который был введён в [[../../../../knowledge/dev/java/Java 9|Java 9]] как часть модульной системы [[Java Platform Module System|JPMS]]. Его основная задача — создание кастомизированных [[JDK]], включающих только необходимые модули для работы конкретного приложения.
Благодаря исключению ненужных модулей, приложения, собранные с помощью JLink, становятся легче и быстрее загружаются. Это особенно важно для приложений, работающих в ограниченных средах, например, в микросервисной архитектуре или на встраиваемых устройствах. Меньший размер JRE снижает время старта и использование оперативной памяти, что критично в условиях ограниченных ресурсов.
Например, обычный JRE содержит десятки модулей, таких как `java.sql` или `java.xml`, которые могут быть не нужны конкретному приложению. Используя JLink, разработчик может создать минимальный набор модулей, достаточный для его проекта.
Основная команда JLink выглядит следующим образом:
```bash
jlink --module-path $JAVA_HOME/jmods --add-modules <список модулей> --output <путь_к_результирующей_JRE>
```
- `--module-path` указывает путь к модульной системе JDK, которая по умолчанию находится в папке `jmods` в вашем JDK.
- `--add-modules` определяет, какие модули будут включены в итоговую сборку JRE. Это могут быть как модули стандартной библиотеки (например, `java.base`), так и модули вашего приложения.
- `--output` указывает папку, в которую будет выведена готовая сборка JRE.
**Основные опции JLink**
- `-strip-debug`. Удаляет символы отладки из итоговой сборки JRE. Это помогает дополнительно уменьшить размер JRE, особенно когда приложение не нуждается в отладочной информации.
- `--compress`. отвечает за сжатие файлов в сборке JRE. Она поддерживает несколько уровней сжатия:
- 0 — без сжатия (по умолчанию),
- 1 — сжатие классов, но без применения дорогих методов сжатия,
- 2 — максимальное сжатие, что снижает размер сборки, но может замедлить время загрузки.
- `-strip-native-commands`. Эта опция удаляет нативные команды (например, инструменты вроде jcmd, jmap, и другие утилиты), которые не нужны в большинстве рабочих окружений.
- `--launcher`. Позволяет создавать собственные лаунчеры для вашего приложения. Это может быть полезно для упрощения запуска приложения конечными пользователями. Лаунчеры создаются в директории bin сгенерированной JRE. Пример `--launcher myapp_launcher=myapp.module/com.example.Main`
- `--bind-services`. Полезна для автоматического связывания сервисов, если приложение использует `ServiceLoader`. Эта опция необходима, когда модульная система управляет загрузкой сервисов, и их нужно зарегистрировать для запуска приложения.
- `--target`. Позволяет создавать JRE для других платформ (например, создавать сборку для Linux с машины на Windows). Пример `--target linux-x64`
[[JDeps]] анализирует зависимости приложения, автоматически определяя, какие модули используются, а JLink на основе этого анализа создаёт кастомную JRE
Пример совместного использования JDeps и JLink:
```bash
jlink --add-modules $(jdeps --multi-release 17 --ignore-missing-deps -q -recursive --print-module-deps -cp 'project-core/build/lib/boot/*':'project-core/build/lib/main/*':'project-core/build/app/*' project-core/build/app/*) --strip-debug --no-man-pages --no-header-files --compress=2 --output ./build/jdk
```
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-15]]
**Автор**::
### Дополнительные материалы
- [[JDeps]]
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,58 @@
---
aliases:
- модули
- модуль
- модулей
- JPMS
- модульную систему
tags:
- maturity/🌱
date: 2024-10-15
zero-link:
parents:
linked:
---
Модульная система Java (JPMS), представленная в [[../../../../knowledge/dev/java/Java 9|Java 9]], позволяет разработчикам разбивать приложения на логически обособленные блоки — модули.
> [!WARNING] Не Maven/Gradle модули
> Модули в Maven и Gradle — это структурные единицы системы сборки, которые помогают управлять зависимостями и сборкой проекта, но они не являются модулями в контексте модульной системы Java (JPMS).
Модуль - это набор пакетов, содержащих типы (классы и интерфейсы) ресурсы и другие виды статической информации.
**Какие проблемы решает?**
- Делает зависимости явными
- Улучшает [[../architecture/Инкапсуляция|инкапсуляцию]], предотвращая создание нежелательных зависимостей между модулями. Все привыкли к модификаторам доступов у классов, но у пакетов модификаторов доступа не было.
Одним из ключевых преимуществ JPMS является чёткий контроль зависимостей. В старой системе через classpath все классы и пакеты были доступны друг другу без явного указания разрешений, что часто приводило к ошибкам и некорректному использованию библиотек. С JPMS разработчики могут точно указывать, какие зависимости нужны модулю и какие его части будут видимы другим модулям.
## Дескриптор
Каждый модуль имеет дескриптор - файл `module-info.java`, который содержит описание того, какие зависимости необходимы модулю и какие пакеты он экспортирует для других.
Дескриптор описывает:
- Импортируемые, экспортируемые, транзитивно-экспортируемые пакеты.
Пример простого дескриптора:
```java title=module-info.java
module com.example.myapp {
requires java.sql;
exports com.example.myapp.service;
}
```
В этом примере модуль `com.example.myapp` использует (`requires`) модуль `java.sql` и экспортирует (`exports`) пакет `com.example.myapp.service`, который может быть использован другими модулями. Все остальные пакеты, не указанные в директиве `exports`, остаются приватными и недоступными для других модулей.
> [!NOTE] Обратная совместимость
> Модульная система разработана с учётом совместимости с предыдущими версиями JDK. Проекты, которые не перешли на JPMS, могут по-прежнему использовать старую систему через classpath.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**:: [[../../../../knowledge/dev/java/Устройство Java|Устройство Java]]
**Источник**::
**Создана**:: [[2024-10-15]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,69 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-10-19
zero-link:
parents:
linked:
---
**Code block (блок кода)**. Это фрагмент программы, заключенный между фигурными скобками `{}`. Он может быть частью метода, цикла, условия или других конструкций. В блоке кода содержатся операторы (statements), которые выполняются в порядке их написания.
![[../../meta/files/images/Pasted image 20241019092032.png]]
**Statement (оператор, предложение, инструкция)**. Выполняет какое-то действие, но не возвращает значения. Оператор заканчивается точкой с запятой `;`, однако сам символ `;` не является частью выражения (expression).
![[../../meta/files/images/Pasted image 20241019092300.png]]
**Expression (выражение)**
Выражение — это часть кода, которая вычисляет значение. Оно может включать переменные, константы, операторы и вызовы методов.
Выражение может быть использовано как часть оператора или в других контекстах, например, внутри условий.
**Имя метода**. Имя метода идентифицирует конкретную функцию или действие, которое выполняет метод.
**Аргументы метода.** В Java метод всегда имеет список аргументов, даже если они отсутствуют. В таком случае используются пустые скобки `()`.
![[../../meta/files/images/Pasted image 20241019093016.png]]
**Параметры метода.** Параметры метода — это переменные, указанные в скобках при его объявлении. Эти параметры получают значения при вызове метода.
Есть есть для того, кто вызывает метод передаваемые значения называются аргументами, а уже в самом методе аргументы называются параметрами.
**Сигнатура метода.** Сигнатура метода включает его имя и список аргументов, но не возвращаемый тип. Это ключевой элемент для различения методов с одинаковыми именами, но разными параметрами.
**Квалификатор.** Это часть выражения слева от точки, указывающая на объект или класс, через который вызывается метод или поле. Квалификатор может быть необязательным и иногда отсутствовать.
![[../../meta/files/images/Pasted image 20241019092501.png]]
Например, в выражении `System.out.println()` квалификатором для метода `println` является `out`, а для `out``System`.
**Declaration (объявление)**. Это процесс создания переменной, метода или другой сущности в программе с указанием её типа и имени. При объявлении переменной указывается её тип (например, `int`, `String`) и имя, но ей может не присваиваться значение сразу.
Объявление сообщает компилятору, что данная переменная или метод существует и будет использоваться в дальнейшем. Объявление может сопровождаться **инициализацией** — присвоением переменной значения при её создании.
Пример объявления переменной:
```java
int myNumber; // Объявление переменной типа int с именем myNumber
```
Пример объявления метода:
```java
void myMethod() {
// тело метода
}
```
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-19]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,8 @@
## Заметки созданные в этот день
<!-- QueryToSerialize: LIST WHERE "garden/ru" and (contains(date, this.file.link) or contains(Создана, this.file.link)) -->
<!-- SerializedQuery: LIST WHERE "garden/ru" and (contains(date, this.file.link) or contains(Создана, this.file.link)) -->
- [[2024-10-19 1729318046]]
- [[Семантический разрыв]]
- [[Голосарий Java]]
<!-- SerializedQuery END -->

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

View File

@ -0,0 +1 @@
d1daeba3f033bd31d7700b6e3ae83c73

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

View File

@ -0,0 +1 @@
8f7e1d3f4bffeeb715397ccc50793e50

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

View File

@ -0,0 +1 @@
b583807a29d4001779d2bcc488afe0f4

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

View File

@ -0,0 +1 @@
7e5a2e00ff0b9f306201c3081346764c

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -0,0 +1 @@
d1daeba3f033bd31d7700b6e3ae83c73

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -0,0 +1 @@
8f7e1d3f4bffeeb715397ccc50793e50

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1 @@
b583807a29d4001779d2bcc488afe0f4

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1 @@
7e5a2e00ff0b9f306201c3081346764c

View File

@ -5,6 +5,9 @@ zero-link:
- "[[00 Разработка]]"
title: Java разработка
---
В коммуникациях и обучении всегда важно устранить или уменьшить [[../../../../_inbox/Семантический разрыв|семантический разрыв]] между людьми, поэтому рекомендую переодически обращаться к [[../../dev/java/Голосарий Java|голосарию Java]], чтобы использовать одни и те же термины и определения.
Основные узлы:
- [Устройство Java](Устройство%20Java.md)
- [[../../dev/java/Многопоточность в Java|Многопоточность в Java]]
- Системы сборки
@ -17,7 +20,17 @@ title: Java разработка
- [Hibernate](00%20Hibernate.md)
- [[../../../../knowledge/dev/java/other/Jackson|Jackson]]
- [Снипеты для Java](00%20Снипеты%20для%20Java.md)
## Версии Java
- [[Java 1]]
- [Java 7](Java%207.md)
- [[Java 8 LTS]]
- [Java 9](Java%209.md)
- [[Java 10]]
- [Java 11 LTS](Java%2011%20LTS.md)
- [Java 12](Java%2012.md)
- [[Java 15]]
- [[Java 17 LTS]]
- [[../../dev/java/Java 21 LTS|Java 21 LTS]]
## Мои образовательные статьи
- [Функциональные интерфейсы и лямбды в Java](https://struchkov.dev/blog/ru/lambda-expression-java/)
- [Основы памяти в Java: Куча и Стек](https://struchkov.dev/blog/ru/memory-in-java/)
@ -37,17 +50,7 @@ title: Java разработка
- [Не используйте @Data](../../dev/java/Не%20используйте%20@Data.md)
- [Возвращайте пустую коллекцию вместо null](../../dev/java/Возвращайте%20пустую%20коллекцию%20вместо%20null.md)
- [[../../dev/java/Границы применимости Tuple и Pair в разработке|Границы применимости Tuple и Pair в разработке]]
## Версии Java
- [[Java 1]]
- [Java 7](Java%207.md)
- [[Java 8 LTS]]
- [Java 9](Java%209.md)
- [[Java 10]]
- [Java 11 LTS](Java%2011%20LTS.md)
- [Java 12](Java%2012.md)
- [[Java 15]]
- [[Java 17 LTS]]
- [[../../dev/java/Java 21 LTS|Java 21 LTS]]
## Дополнительно
- [Нативные сборки в Java](../../dev/java/Нативные%20сборки%20в%20Java.md)