Java Portal | Программирование
前往频道在 Telegram
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg
显示更多📈 Telegram 频道 Java Portal | Программирование 的分析概览
频道 Java Portal | Программирование (@java_iibrary) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 12 132 名订阅者,在 技术与应用 类别中位列第 10 377,并在 俄罗斯 地区排名第 54 419 位。
📊 受众指标与增长动态
自 невідомо 创建以来,项目保持高速增长,吸引了 12 132 名订阅者。
根据 05 六月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 -142,过去 24 小时变化为 -1,整体触达仍然可观。
- 认证状态: 未认证
- 互动率 (ER): 平均受众互动率为 11.75%。内容发布后 24 小时内通常能获得 6.20% 的反应,占订阅者总量。
- 帖子覆盖: 每篇帖子平均可获得 1 426 次浏览,首日通常累积 753 次浏览。
- 互动与反馈: 受众积极参与,单帖平均反应数为 4。
- 主题关注点: 内容集中在 boot, string, void, архитектура, resttemplate 等核心主题上。
📝 描述与内容策略
作者将该频道定位为表达主观观点的平台:
“Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg”
凭借高频更新(最新数据采集于 07 六月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。
12 132
订阅者
-124 小时
-407 天
-14230 天
帖子存档
Не используйте
ELSE 0 вместе с COUNT и CASE
Использование ELSE 0 - очень частая ошибка у новичков, когда они комбинируют функцию COUNT с выражением CASE. Обычно это происходит из-за непонимания того, как именно COUNT работает при применении к столбцу.
Когда используется COUNT(column), функция считает все значения, которые не равны NULL, включая нули. Это значит, что если в выражении CASE указан ELSE 0, каждая строка, не попавшая под условие, превращается в значение 0. В результате такие строки тоже попадают в подсчёт.
Вот наивный пример:
sql id="g4suvd"
SELECT
Department,
COUNT(CASE
WHEN Status = 'Active' THEN EmployeeID
ELSE 0
END) AS ActiveEmployees
FROM Employees
GROUP BY Department;
В этом запросе каждая строка, которая не удовлетворяет условию, превращается в 0, а это валидное значение, поэтому оно тоже учитывается в COUNT. Из-за этого результат может получиться вводящим в заблуждение.
Лучше всего вообще убрать ELSE. Когда ветка ELSE опущена, выражение CASE возвращает NULL для строк, которые не соответствуют условию. А так как COUNT() игнорирует NULL, будут посчитаны только строки, которые действительно удовлетворяют условию. Вот правильный вариант:
sql id="vxa5np"
SELECT
Department,
COUNT(CASE
WHEN Status = 'Active' THEN EmployeeID
END) AS ActiveEmployees
FROM Employees
GROUP BY Department;
В этой версии строки, не подходящие под условие, возвращают NULL, и COUNT() естественным образом исключает их из подсчёта. В итоге запрос получается чище, а подсчёт корректно отражает только те значения, которые реально соответствуют условию.
👉 Java PortalAPI Gateway, если по-человечески:
Клиент не должен ходить в 6 разных сервисов.
Он должен ходить в одну точку.
Gateway стоит перед всей системой и берёт на себя:
- маршрутизацию входящих запросов в нужный сервис
- валидацию токенов, например JWT и OAuth, ещё до того, как запрос вообще дойдёт до сервисов
- rate limiting, чтобы API не абьюзили
- логирование, чтобы наблюдаемость была в одном месте
- балансировку нагрузки между инстансами сервисов
Без gateway каждый сервис заново городит у себя аутентификацию, логирование и rate limiting.
С gateway всё это решается один раз, централизованно.
Вот и вся суть: одна точка входа и единый слой контроля.
👉 Java Portal
Совет по Spring Boot: ускорить приложение можно с помощью
@EnableCaching и @Cacheable.
🟢Позволяет избежать повторных вызовов к БД и API
🟢 Снижает задержки
🟢 По умолчанию Spring использует in-memory map, но в проде можно подключить внешний провайдер кеша
👉 Java PortalЯ побывал по обе стороны собеседований по system design.
Ниже темы, которые нужно изучить, чтобы действительно хорошо в этом разбираться:
1. [Сервер]
2. [Задержка и пропускная способность]
3. [Масштабирование и его виды]
– Вертикальное и горизонтальное масштабирование
4. [Автомасштабирование]
5. [Прикидочные расчеты]
6. [Теорема CAP]
7. [Масштабирование базы данных]
– Индексы
– Партиционирование
– Архитектура master-slave
– Multi-master
– Шардирование базы данных
– Недостатки шардирования
8. [SQL и NoSQL базы данных и когда что использовать]
9. [База данных]
– SQL-база данных
– NoSQL-база данных
– Масштабирование в NoSQL и SQL
– Когда какую базу использовать?
10. [Микросервисы]
– Монолит vs микросервисы
– Зачем вообще разбивать приложение на микросервисы?
– Когда использовать микросервисы?
– Как клиенты делают запросы в микросервисной архитектуре?
11. [Глубокое погружение в load balancer]
– Зачем нужен load balancer?
– Алгоритмы load balancing
12. [Кеширование]
– Плюсы кеширования
– Типы кешей
– Redis
13. [Blob Storage]
– Что такое blob и зачем нужно blob storage?
– AWS S3
14. [CDN, Content Delivery Network]
– Как работает CDN?
15. [Message Broker]
– Асинхронное программирование
– Зачем ставить message broker между сервисами?
– Очередь сообщений
– Поток сообщений
– Когда использовать message broker
16. [Глубокое погружение в Apache Kafka]
– Когда использовать Kafka
– Внутреннее устройство Kafka
17. [Pub/sub в реальном времени]
18. [Event-Driven Architecture]
– Зачем использовать EDA?
– Простое уведомление о событии
– Передача состояния через событие
19. [Распределенные системы]
20. [Самовосстанавливающаяся система с election лидера]
21. [Глубокое погружение в consistency]
– Строгая согласованность
– Когда выбирать strong consistency
– Eventual consistency
– Когда выбирать eventual consistency
– Способы добиться strong consistency
– Способы добиться eventual consistency
22. [Consistent hashing]
23. [Избыточность данных и восстановление данных]
– Зачем делать базы данных избыточными?
– Разные способы резервного копирования
– Непрерывная избыточность
24. [Прокси]
– Forward proxy vs reverse proxy
👉 Java Portal
9 000₽ за вечер. Без кода. Без офиса. Без опыта.
Именно столько платят за одного чат-бота для бизнеса начинающим спецам.
Берёшь шаблон → собираешь бота → сдаёшь клиенту. Первые деньги — в первую же неделю.
Показываю, как новичку делать чат-ботов для бизнеса за дорого:
👉 @other_digital_bot
Java-совет: начиная с Java 9 можно использовать
Stream.takeWhile() для удобной "нарезки" списков через стримы.
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
✗ Вместо:
List<Integer> result = new ArrayList<>();
for (Integer n : numbers) {
if (n < 5) {
result.add(n);
} else {
break;
}
}
System.out.println(result); // [1, 2, 3, 4]
✓ Можно так:
result = numbers.stream().takeWhile(n -> n < 5).toList();
System.out.println(result); // [1, 2, 3, 4]
👉 Java PortalЧто такое BeanPostProcessor в Java Spring Boot?
Это интерфейс, который позволяет вмешиваться в процесс создания и инициализации бинов в Spring-контейнере.
Он предоставляет два основных метода, которые вызываются на разных этапах жизненного цикла бина:
1.
postProcessBeforeInitialization(Object bean, String beanName)
Вызывается до инициализации бина (до вызова метода с @PostConstruct или InitializingBean#afterPropertiesSet).
2. postProcessAfterInitialization(Object bean, String beanName)
Вызывается после инициализации бина (после того, как все методы инициализации завершились).
Зачем нужен BeanPostProcessor?
Он используется для дополнительной обработки и кастомизации бинов после их создания, но до того, как они будут переданы клиентскому коду.
Примеры:
- Добавление проксирования бинов (например, для AOP или транзакций)
- Валидация или изменение свойств бина
- Логирование жизненного цикла
- Добавление кастомных аннотаций
- Обработка marker-интерфейсов
Как это работает?
1. Spring сканирует контекст на наличие бинов, которые реализуют интерфейс BeanPostProcessor.
2. Если такие бины найдены, они применяются ко всем бинам в приложении.
3. Методы postProcessBeforeInitialization и postProcessAfterInitialization вызываются для каждого бина, который создаёт Spring.
👉 Java PortalJava: используй
ReentrantReadWriteLock, если у тебя частые чтения и мало записей.
ReentrantReadWriteLock это утилита конкурентности в Java, которая дает два типа локов:
1. Read lock (лок на чтение): позволяет нескольким потокам читать одновременно, пока ни один поток не пишет.
2. Write lock (лок на запись): позволяет писать только одному потоку и блокирует всех остальных читателей и писателей, пока лок не будет освобожден.
Используй ReentrantReadWriteLock, когда:
1. Твой код часто читает разделяемые данные.
2. Записи происходят редко.
3. Ты хочешь выжать максимум параллелизма: разрешить нескольким читателям работать одновременно, но гарантировать, что запись идет строго эксклюзивно.
Пример:
public class SharedValue {
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private int value = 0;
public int readValue() {
lock.readLock().lock();
try {
return value;
} finally {
lock.readLock().unlock();
}
}
public void writeValue(int newValue) {
lock.writeLock().lock();
try {
value = newValue;
} finally {
lock.writeLock().unlock();
}
}
}
👉 Java PortalКак прогреть кэши в Spring Boot?
Или вообще как выполнить что-то на старте Spring Boot приложения?
Обычно такие операции делают в
@PostConstruct или подписываются на событие ApplicationReadyEvent. Но у этих вариантов есть заметный минус.
Если “прогрев” находится в @PostConstruct, как отключить его в тестах? Можно добавить флаг, сделать сабкласс и подменить его в тестовой конфигурации, но это не всегда помогает и часто выглядит как костыль.
Более элегантный способ “прогреть кэши”
Смотри: SpringApplication.run(...) возвращает полностью готовый контекст. Можно достать из него компонент и вызвать нужный метод “прогрева”.
Код выглядит как на картинке:
Плюс: В интеграционных тестах с @SpringBootTest метод main не запускается. Соответственно, код внутри него не выполняется. Никаких костылей вокруг @PostConstruct, все чисто и красиво.
Когда “прогрев” все-таки нужен в тестах, добавляем параметр use main method:
@SpringBootTest(useMainMethod = SpringBootTest.UseMainMethod.ALWAYS)
👉 Java PortalСовет по Spring Boot: со Spring Boot и Spring Security ты можешь легко защитить эндпоинты.
✅ Чтобы защитить следующий REST-эндпоинт:
@RestController
public class MyController {
@GetMapping
("/admin")
public String admin() {
...
}
...
}
✅ Можно написать такую конфигурацию:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin").authenticated()
.anyRequest().permitAll()
.and()
.httpBasic();
}
}
- authorizeRequests(): начинает описание эндпоинтов, которым нужна защита.
- antMatchers("/admin").authenticated(): требует аутентификацию для /admin.
- anyRequest().permitAll(): все остальные эндпоинты публичные.
- httpBasic(): включает HTTP Basic Auth.
👉 Java Portal5 часто задаваемых вопросов на собеседованиях по Java Generics.
На сколько из них ты сможешь ответить?
1. В чем разница между
Object<?> и Object в Java?
2. В чем разница между List<?> и List<Object>?
3. В чем разница между List<? extends Number> и List<? super Number>?
4. Можно ли добавлять элементы в List<?>?
5. Чем T отличается от ? в дженериках?
👉 Java PortalСкачал Java, написал код, запустил - работает. Можно выдохнуть? 😎
Спойлер: нет.
Потому что завтра нужно будет написать что-то свое, без туториала. И тут выяснится, что public static void main - это для тебя просто магический ритуал, а не код.
❌ Копировать с экрана - не значит понимать.
❌ Выучить 10 уроков на YouTube - не значит стать разработчиком.
❇️ Ребята из Merion Academy (того самого YouTube-канала про IT) на бесплатных вводных уроках по Java разбирают код построчно, чтобы ты не просто копировал, а понимал, что пишешь.
Что внутри:
✔️ Что такое Java и с чем ее едят
✔️ Как настроить среду без боли (чтобы все взлетело с первого раза)
✔️ Разбор синтаксиса построчно - никакой магии
✔️ Как написать свое первое REST API (да, сразу)
➡️ Запишись на бесплатные вводные уроки
Разберись, как Java работает на самом деле.
Java tip: Начиная с Java 12 можно использовать
String.indent(n), чтобы красиво форматировать многострочные строки, добавляя нужный отступ.
n > 0: добавляет n пробелов в начале каждой строки.
n < 0: удаляет до n ведущих пробелов из каждой строки.
✅ Добавление пробелов:
String text = "Text\ncontent";
System.out.println(text.indent(0));
System.out.println(text.indent(4));
System.out.println(text.indent(0));
✅ Удаление пробелов:
String text = " Text\n content";
System.out.println(text.indent(-4));
👉 Java PortalВидел интересное видео от CTO Zerodha про то, как они масштабировали Postgres с 7+ млн таблиц.
Технология просто выносит мозг, а если копнуть глубже, становится еще веселее:
- синхронщина? не масштабируется, значит выкидываем.
- все в async. тяжелую генерацию отчетов ставим в очередь.
- независимый middleware, которому все равно на базу и на приложение.
- собрали “DungBeetle” на Go: обобщенные, независимые от СУБД HTTP API, чтобы тянуть отчеты из любой базы.
- результаты сливаем в отдельную Results DB, а приложение читает уже оттуда.
Вот так выглядит настоящий масштаб.
Смотреть видео
👉 Java Portal
Spring Boot:
@AutoConfigureMockMvc позволяет тестировать контроллеры, не поднимая сервер. Она говорит Spring Boot автоматически сконфигурировать экземпляр MockMvc в тестовом контексте.
@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void shouldReturnUser() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value(1));
}
}
1. @SpringBootTest поднимает полный application context.
2. @AutoConfigureMockMvc настраивает MockMvc.
3. Никакого Tomcat (и других встроенных серверов).
4. Запросы выполняются внутри через DispatcherServlet от Spring.
👉 Java PortalИщу хороший репозиторий с Claude skills для Java, Spring Boot и т.п. Нашёл вот этот: https://github.com/decebals/claude-code-java.
👉 Java Portal
Вопрос для интервью по Java Spring Boot:
@Transactional + @EventListener
С тех пор как AI начал активно залезать в мир разработки, паттерны на собеседованиях меняются.
Тренд, который я недавно наблюдал: дают сниппет кода, и ты должен его проревьюить и отрефакторить логику под прод.
[Дано]:
Команда написала логику отправки письма после регистрации пользователя. На проде иногда бывает ситуация: письма приходят, а пользователя в базе нет. Найди проблему и почини:
[Задачи]:
- Объясни, в каком сценарии письмо будет отправлено, но пользователь не сохранится
- Исправь код так, чтобы событие обрабатывалось только после того, как пользователь сохранён
Код:
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final ApplicationEventPublisher eventPublisher;
@Transactional
public void register(UserDto dto) {
User user = new User(http://dto.email());
http://userRepository.save(user);
eventPublisher.publishEvent(new UserRegisteredEvent(user));
}
}
@Component
@RequiredArgsConstructor
public class EmailListener {
private final EmailSender emailSender;
private final SomeOtherService someOtherService;
@EventListener
public void onUserRegistered(UserRegisteredEvent event) {
emailSender.sendWelcome(event.user().getEmail());
someOtherService.doSomething();
}
}
👉 Java PortalСовет по Java:
Stream.toArray(Type[]::new) это аккуратный и типобезопасный способ получить массив из стрима.
Избавляет от Object[] и ручных кастов.
👉 Java PortalПочему твой бэкенд начинает тупить на 10k юзеров, хотя на 100 всё летало
Обычно причина одна из этих:
1️⃣N+1 запросы
→ один запрос незаметно триггерит сотню походов в БД
2️⃣Нет индексов
→ на каждом поиске полный проход по таблице
3️⃣Тяжелая работа синхронно
→ письма, обработка картинок прямо внутри request cycle
4️⃣Нет стратегии кеширования
→ один и тот же запрос в БД выполняется 1000 раз
5️⃣Единая точка отказа
→ один инстанс БД тащит на себе вообще всё
Приложение не стало внезапно медленным.
Оно просто доросло до момента, когда плохие решения стали заметны.
👉 Java Portal
Задумывался, как работают ActiveMQ и RabbitMQ?
В основе у них producer/consumer паттерн.
Как его реализовать?
Это базовая схема обмена данными между несколькими потоками. Поток-продюсер отправляет объекты на условную обработку, а потоки-консьюмеры асинхронно их получают и обрабатывают.
Общий вид решения такой:
продюсер кладет объекты в специальную коллекцию, буфер. Когда консьюмер освобождается, он запрашивает из буфера один объект. Если буфер пустой, консьюмер блокируется и ждёт; если буфер переполнен, ждёт продюсер.
Реализовать этот паттерн можно по-разному.
Самый правильный способ для продакшена: брать готовую реализацию из стандартной библиотеки, например
BlockingQueue.
На собеседованиях обычно просят написать реализацию с нуля. На картинке показан один из вариантов.
Модификатор synchronized гарантирует, что в один момент времени выполняется только один из методов и только одним потоком. Этого достаточно для корректной работы, пока буфер не пуст и не переполнен. Когда буфер пустой или полный, управление явно передаётся продюсеру или консьюмеру соответственно через notify() и wait().
👉 Java Portal
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
