Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓
Голосуем за тему к рассмотрению в эти выходные!
Выбираем новую тему!
(можете предложить что-то из того что предлагали на прошлой неделе и что проигрывает в голосовании!)
Не стесняемся!✌️
Голосуем за тему к рассмотрению в эти выходные!
Выбираем новую тему!
(можете предложить что-то из того что предлагали на прошлой неделе и что проигрывает в голосовании!)
Не стесняемся!
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем разница между throw и throws? 🤓
Ответ:
throw используется для явного выброса исключения, например: throw new IOException();.
throws указывается в сигнатуре метода, чтобы сообщить, какие проверяемые исключения он может выбросить, например: void method() throws IOException.
#собеседование
Ответ:
throws указывается в сигнатуре метода, чтобы сообщить, какие проверяемые исключения он может выбросить, например: void method() throws IOException.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
С 24.05 по 31.05
Предыдущий пост(с 17.05 по 23.05)
Следующая неделя
Воскресный мотивационный пост:
"Твой первый проект — важнее, чем думаешь"
Выбранная голосованием тема:
Паттерны проектирования на Java: суть, история и применение
Запись встреч:
Изучаем Swagger
Обучающие статьи:
Глубокое изучение типа данных double в Java
Глубокое изучение типа float в Java
Глубокое изучение типа данных char в Java
Введение в Liquibase
Структура и основные команды Liquibase
Пост под которым нет поздравлений:
Сегодня каналу исполнился год!🥳
Авторские статьи:
Как я память искал (Часть I)
Как я память искал (Часть II)
Полезные статьи и видео:
Управление транзакциями в Spring: подробно о @Transactional
Делаем свою простейшую систему сборки для Java
Проблема N+1 в Hibernate — ВСЕ СПОСОБЫ решения
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
#memory
Предыдущий пост(с 17.05 по 23.05)
Следующая неделя
Воскресный мотивационный пост:
"Твой первый проект — важнее, чем думаешь"
Выбранная голосованием тема:
Паттерны проектирования на Java: суть, история и применение
Запись встреч:
Изучаем Swagger
Обучающие статьи:
Глубокое изучение типа данных double в Java
Глубокое изучение типа float в Java
Глубокое изучение типа данных char в Java
Введение в Liquibase
Структура и основные команды Liquibase
Пост под которым нет поздравлений:
Сегодня каналу исполнился год!
Авторские статьи:
Как я память искал (Часть I)
Как я память искал (Часть II)
Полезные статьи и видео:
Управление транзакциями в Spring: подробно о @Transactional
Делаем свою простейшую систему сборки для Java
Проблема N+1 в Hibernate — ВСЕ СПОСОБЫ решения
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
#memory
Please open Telegram to view this post
VIEW IN TELEGRAM
Распространённые ошибки
1. Логика в контроллерах
Признак: контроллер становится "сервисом", содержащим условия, циклы, доступ к БД. Это нарушает принципы чистой архитектуры и усложняет тестирование.
2. Использование Entity в представлении
Передача @Entity напрямую в шаблон может привести к:
Утечке данных (например, паролей).
Ошибкам LazyInitializationException.
Сильной связанности представления с базой данных.
Решение: использовать DTO или ViewModel.
3. Жёсткая связность между слоями
View не должно зависеть от Repository, а Controller — от Entity. Каждый слой должен взаимодействовать только с соседним.
4. Отсутствие DTO
Использование одной и той же модели во всех сценариях ведёт к путанице и проблемам безопасности. Лучше использовать отдельные классы:
UserCreateRequest
UserResponse
UserUpdateRequest
Рекомендации по проектированию
Структура проекта
Хорошей практикой является разделение кода по слоям:
URL-дизайн
Соблюдайте RESTful-стиль:
GET /users — получить список пользователей.
GET /users/{id} — получить конкретного пользователя.
POST /users — создать.
PUT /users/{id} — обновить.
DELETE /users/{id} — удалить.
Использование DTO
Расширения и адаптации MVC
SPA + API
При использовании Vue, React или Angular, представление полностью переносится на фронтенд. В этом случае Spring работает как REST API с @RestController, и классическая схема MVC трансформируется в «REST + JSON».
Поддержка реактивности
Spring WebFlux реализует неблокирующую модель с Mono и Flux, сохраняя при этом логическую структуру MVC. Подходит для высоконагруженных и асинхронных приложений.
Тестирование компонентов MVC
Контроллеры — @WebMvcTest, MockMvc.
Сервисы — @SpringBootTest или с моками (@MockBean).
Репозитории — @DataJpaTest.
#Java #для_новичков #beginner #on_request #mvc
1. Логика в контроллерах
Признак: контроллер становится "сервисом", содержащим условия, циклы, доступ к БД. Это нарушает принципы чистой архитектуры и усложняет тестирование.
2. Использование Entity в представлении
Передача @Entity напрямую в шаблон может привести к:
Утечке данных (например, паролей).
Ошибкам LazyInitializationException.
Сильной связанности представления с базой данных.
Решение: использовать DTO или ViewModel.
3. Жёсткая связность между слоями
View не должно зависеть от Repository, а Controller — от Entity. Каждый слой должен взаимодействовать только с соседним.
4. Отсутствие DTO
Использование одной и той же модели во всех сценариях ведёт к путанице и проблемам безопасности. Лучше использовать отдельные классы:
UserCreateRequest
UserResponse
UserUpdateRequest
Рекомендации по проектированию
Структура проекта
Хорошей практикой является разделение кода по слоям:
com.example.myapp
├── controller
├── service
│ └── impl
├── repository
├── dto
├── model
├── config
URL-дизайн
Соблюдайте RESTful-стиль:
GET /users — получить список пользователей.
GET /users/{id} — получить конкретного пользователя.
POST /users — создать.
PUT /users/{id} — обновить.
DELETE /users/{id} — удалить.
Использование DTO
public class UserResponse {
private Long id;
private String name;
}
public class UserCreateRequest {
private String name;
private String email;
}
Расширения и адаптации MVC
SPA + API
При использовании Vue, React или Angular, представление полностью переносится на фронтенд. В этом случае Spring работает как REST API с @RestController, и классическая схема MVC трансформируется в «REST + JSON».
Поддержка реактивности
Spring WebFlux реализует неблокирующую модель с Mono и Flux, сохраняя при этом логическую структуру MVC. Подходит для высоконагруженных и асинхронных приложений.
Тестирование компонентов MVC
Контроллеры — @WebMvcTest, MockMvc.
Сервисы — @SpringBootTest или с моками (@MockBean).
Репозитории — @DataJpaTest.
#Java #для_новичков #beginner #on_request #mvc
Please open Telegram to view this post
VIEW IN TELEGRAM
Есть предложение встретиться завтра в 16:00 по МСК на лайвкодинг!
Тема будет: Многопоточка на примерах
Тема будет: Многопоточка на примерах
Anonymous Poll
33%
О, интересно, я приду ✈️
27%
Блииин, я хочу, но нет возможности 🤷♀️
39%
Посмотрю в записи 👌
0%
Не приду. Фигню какую то рассматриваете 🤢
Всем привет! ✌️
Приглашаю всех желающих сегодня собраться в Яндекс.Телемост в 16:00 по МСК!
В этот раз, @rKiraLis39 расскажет и покажет много интересного по многопоточке.
И даже если раньше вы все это знали, лишним повторить не будет.
Приходите, это хороший шанс позадавать вопросы🧑💻
Как всегда жду всех! 🫡
Приглашаю всех желающих сегодня собраться в Яндекс.Телемост в 16:00 по МСК!
В этот раз, @rKiraLis39 расскажет и покажет много интересного по многопоточке.
И даже если раньше вы все это знали, лишним повторить не будет.
Приходите, это хороший шанс позадавать вопросы
Как всегда жду всех! 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
Предлагаем темы для разбора и публикации! 📖
В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.
Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.
Примерные правила:
🟢 темы, не выше уровня middle, чтоб был интерес общим.
🟢 один человек - одна тема.
🟢 Тема должна быть отдельным теоретически-практическим вопросом. Готовый проект - это не тема!
Жду Ваших предложений!👏
В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.
Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.
Примерные правила:
Жду Ваших предложений!
Please open Telegram to view this post
VIEW IN TELEGRAM
Выбираем темы предложенные на этой неделе!
Anonymous Poll
31%
JavaMailSender
14%
AOP
20%
IO/NIO
20%
Maven
14%
JSON
Please open Telegram to view this post
VIEW IN TELEGRAM
Многопоточка во всей красе. Часть 1.
Встреча от 01.06.2025
Запись встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече @rKiraLis39 (огромное спасибо ему👏 ) начал рассказывать нам о многопоточке.
Что мы узнали:
🔜 Что такое многопоточка и зачем она нужна.
🔜 Как создать и настроить поток
🔜 Как остановить поток, как избежать дедлоков
🔜 Посмотрели все это на примерах
Ссылки из видео:
Первая
Вторая
Третья
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Спасибо всем кто пришел, респект 🫡
Встреча от 01.06.2025
Запись встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече @rKiraLis39 (огромное спасибо ему
Что мы узнали:
Ссылки из видео:
Первая
Вторая
Третья
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Спасибо всем кто пришел, респект 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
Типы changesets и стратегии развертывания в Liquibase
1. Основные изменения (changesets)
1.1. Создание таблиц (createTable)
Позволяет создавать новые таблицы с указанием столбцов и ограничений.
Пример (YAML):
Разбор:
tableName – имя таблицы.
columns – список столбцов.
constraints – ограничения (primaryKey, nullable, unique).
1.2. Добавление столбцов (addColumn)
Добавляет новый столбец в существующую таблицу.
Пример (YAML):
Параметры:
tableName – имя таблицы.
defaultValue – значение по умолчанию (опционально).
1.3. Изменение структуры (alterTable, modifyDataType)
Используется для изменения типа данных столбца или переименования таблицы.
Пример (YAML):
2. Управление зависимостями
2.1. Атрибуты runAlways и runOnChange
runAlways="true" – changeSet выполняется каждый раз, даже если уже был применен.
2.2. Условия (preConditions)
Проверяют условия перед выполнением changeSet’а.
Пример (YAML):
Доступные проверки:
tableExists / tableNotExists
columnExists
sqlCheck (произвольный SQL-запрос).
3. Стратегии развертывания
3.1. Последовательное применение
ChangeSet’ы выполняются строго по порядку, указанному в databaseChangeLog.
Пример:
3.2. Параллельное выполнение
Liquibase не поддерживает параллельное выполнение changeSet’ов по умолчанию.
Однако можно:
Разделять changelog на независимые модули.
Использовать contexts для условного выполнения.
Пример:
4. Поддержка разных форматов
Liquibase позволяет использовать:
YAML – лаконичный и удобный для разработчиков.
XML – строгий и структурированный.
JSON – альтернатива YAML.
SQL – для прямого написания SQL-запросов.
Пример SQL-формата:
#Java #middle #Liquibase
1. Основные изменения (changesets)
1.1. Создание таблиц (createTable)
Позволяет создавать новые таблицы с указанием столбцов и ограничений.
Пример (YAML):
databaseChangeLog:
- changeSet:
id: 1
author: dev
changes:
- createTable:
tableName: users
columns:
- column:
name: id
type: BIGINT
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: username
type: VARCHAR(50)
constraints:
unique: true
Разбор:
tableName – имя таблицы.
columns – список столбцов.
constraints – ограничения (primaryKey, nullable, unique).
1.2. Добавление столбцов (addColumn)
Добавляет новый столбец в существующую таблицу.
Пример (YAML):
- changeSet:
id: 2
author: dev
changes:
- addColumn:
tableName: users
columns:
- column:
name: email
type: VARCHAR(100)
constraints:
nullable: false
Параметры:
tableName – имя таблицы.
defaultValue – значение по умолчанию (опционально).
1.3. Изменение структуры (alterTable, modifyDataType)
Используется для изменения типа данных столбца или переименования таблицы.
Пример (YAML):
- changeSet:
id: 3
author: dev
changes:
- alterTable:
tableName: users
columns:
- column:
name: username
type: VARCHAR(100) # Увеличение длины
- renameColumn:
tableName: users
oldColumnName: email
newColumnName: email_address
2. Управление зависимостями
2.1. Атрибуты runAlways и runOnChange
runAlways="true" – changeSet выполняется каждый раз, даже если уже был применен.
- changeSet:
id: 4
author: dev
runAlways: true
changes:
- sql:
sql: "INSERT INTO logs (message) VALUES ('Migration executed')"
runOnChange="true" – выполняется только если содержимое changeSet’а изменилось.
2.2. Условия (preConditions)
Проверяют условия перед выполнением changeSet’а.
Пример (YAML):
- changeSet:
id: 5
author: dev
preConditions:
- tableExists:
tableName: users
changes:
- addColumn:
tableName: users
columns:
- column:
name: status
type: VARCHAR(20)
Доступные проверки:
tableExists / tableNotExists
columnExists
sqlCheck (произвольный SQL-запрос).
3. Стратегии развертывания
3.1. Последовательное применение
ChangeSet’ы выполняются строго по порядку, указанному в databaseChangeLog.
Пример:
databaseChangeLog:
- include:
file: db/changelog/v1.0/001-create-tables.yaml
- include:
file: db/changelog/v1.0/002-add-constraints.yaml
3.2. Параллельное выполнение
Liquibase не поддерживает параллельное выполнение changeSet’ов по умолчанию.
Однако можно:
Разделять changelog на независимые модули.
Использовать contexts для условного выполнения.
Пример:
- changeSet:
id: 6
author: dev
context: "!prod" # Не выполнять в production
changes:
- insert:
tableName: test_data
columns:
- column:
name: value
value: "Test"
4. Поддержка разных форматов
Liquibase позволяет использовать:
YAML – лаконичный и удобный для разработчиков.
XML – строгий и структурированный.
JSON – альтернатива YAML.
SQL – для прямого написания SQL-запросов.
Пример SQL-формата:
--liquibase formatted sql
--changeset dev:7
CREATE INDEX idx_user_email ON users(email);
--changeset dev:8 context:prod
ALTER TABLE users ADD COLUMN last_login TIMESTAMP;
#Java #middle #Liquibase
Что выведет код?
#Tasks
public class Task020625 {
public static void main(String[] args) {
String s1 = new String("Java");
String s2 = "Java";
String s3 = s1.intern();
System.out.println((s1 == s2) + " " + (s2 == s3));
}
}
#Tasks
В чем разница между Thread и Runnable? 🤓
Ответ:
Thread — это класс, представляющий поток.
Runnable — интерфейс с методом run(), описывающий задачу для потока.
Runnable предпочтительнее, так как позволяет наследовать другой класс и использовать пулы потоков.
#собеседование
Ответ:
Runnable — интерфейс с методом run(), описывающий задачу для потока.
Runnable предпочтительнее, так как позволяет наследовать другой класс и использовать пулы потоков.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM