Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg
إظهار المزيد📈 نظرة تحليلية على قناة تيليجرام 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) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.
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 Portal@EnableCaching и @Cacheable.
🟢Позволяет избежать повторных вызовов к БД и API
🟢 Снижает задержки
🟢 По умолчанию Spring использует in-memory map, но в проде можно подключить внешний провайдер кеша
👉 Java Portal 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 PortalpostProcessBeforeInitialization(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 PortalReentrantReadWriteLock, если у тебя частые чтения и мало записей.
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@PostConstruct или подписываются на событие ApplicationReadyEvent. Но у этих вариантов есть заметный минус.
Если “прогрев” находится в @PostConstruct, как отключить его в тестах? Можно добавить флаг, сделать сабкласс и подменить его в тестовой конфигурации, но это не всегда помогает и часто выглядит как костыль.
Более элегантный способ “прогреть кэши”
Смотри: SpringApplication.run(...) возвращает полностью готовый контекст. Можно достать из него компонент и вызвать нужный метод “прогрева”.
Код выглядит как на картинке:
Плюс: В интеграционных тестах с @SpringBootTest метод main не запускается. Соответственно, код внутри него не выполняется. Никаких костылей вокруг @PostConstruct, все чисто и красиво.
Когда “прогрев” все-таки нужен в тестах, добавляем параметр use main method:
@SpringBootTest(useMainMethod = SpringBootTest.UseMainMethod.ALWAYS)
👉 Java Portal@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 PortalObject<?> и Object в Java?
2. В чем разница между List<?> и List<Object>?
3. В чем разница между List<? extends Number> и List<? super Number>?
4. Можно ли добавлять элементы в List<?>?
5. Чем T отличается от ? в дженериках?
👉 Java PortalString.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@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@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 PortalStream.toArray(Type[]::new) это аккуратный и типобезопасный способ получить массив из стрима.
Избавляет от Object[] и ручных кастов.
👉 Java PortalBlockingQueue.
На собеседованиях обычно просят написать реализацию с нуля. На картинке показан один из вариантов.
Модификатор synchronized гарантирует, что в один момент времени выполняется только один из методов и только одним потоком. Этого достаточно для корректной работы, пока буфер не пуст и не переполнен. Когда буфер пустой или полный, управление явно передаётся продюсеру или консьюмеру соответственно через notify() и wait().
👉 Java Portal
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
