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 天
帖子存档
Совет по Spring Boot: если тебе нужны интеграционные тесты для контроллеров Spring MVC, а всё остальное ты хочешь замокать, используй
@WebMvcTest — он поднимет только MVC-бины (контроллеры, конфиг MVC, конвертеры, валидацию и т.п.), без полного контекста приложения.
▪️Он грузит только MVC-бины, а не весь application context целиком.
▪️Интеграционные тесты медленнее юнитов, поэтому их стоит ускорять, выкидывая все лишнее, что не нужно конкретно для MVC.
▪️В этом примере мы мокaем бин HelloService и поднимаем только MVC-контекст и сам контроллер:
@WebMvcTest(HelloController.class)
class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private HelloService helloService; // замокано
@Test
void sayHello_returnsExpectedMessage() throws Exception {
given(helloService.getMessage()).willReturn("Hello!");
mockMvc.perform(get("/api/hello"))
.andExpect(status().isOk())
.andExpect(content().string("Hello!"));
}
}
👉 Java Portaljava.evolved это подборка, где каждый старый паттерн из Java показан рядом с его современным заменителем, прямо бок о бок.
👍👍👍
👉 Java Portal
Spring Boot: используй
@SpringBootApplication(exclude = …), чтобы отключить конкретные классы автоконфигурации.
✅ Одна из возможных причин: кастомная конфигурация конфликтует с дефолтной.
👉 Java PortalКакой SQL-запрос будет выполнен при вызове метода
findByEmail()?
1. SELECT * FROM users WHERE email LIKE ?
2. SELECT id, name, email FROM users WHERE email LIKE ?
3. SELECT * FROM users WHERE email = ? LIMIT 1
4. SELECT * FROM users WHERE email = ?
5. SELECT * FROM users WHERE email = email
👉 Java PortalJava tip : старайся не шарить данные между потоками.
✅Используй иммутабельные объекты
✅Либо пусть потоки общаются через сообщения, не трогая общий state напрямую и не мутируя shared-состояние
// С иммутабельными объектами:
record Book(String title, int price) {} // Иммутабельный
public class BookJob implements Runnable {
private final Book book;
.... // конструктор
@Override
public void run() {
System.out.println(book.title() + " " + book.price());
}
}
// Обмен сообщениями:
...
new Thread(() -> {
try {
queue.put("mess1");
} catch (InterruptedException e) {}
}).start();
...
new Thread(() -> {
try {
String mess = queue.take();
} catch (InterruptedException e) {}
}).start();
👉 Java PortalВопрос для собеседования по Spring Boot:
Какой будет результат запуска, если активный профиль не указан?
❓ Spring по умолчанию выберет бин
DevNotificationService
❓ Spring выберет первый бин в алфавитном порядке
❓ Приложение упадет с NoSuchBeanDefinitionException
❓ Бины не будут созданы, но приложение запустится
❓ Будут созданы оба бина - NoUniqueBeanDefinitionException
👉 Java PortalSpring Boot: можно использовать
@Retryable, чтобы переживать нестабильность внешних сервисов.
@Service
public class ExtService {
@Retryable(
value = { HttpServerErrorException.class, ResourceAccessException.class },
maxAttempts = 3,
backoff = @Backoff(delay = 2000, multiplier = 2)
)
public ExtServiceResponse process(ExtServiceRequest request) {
// Call external payment gateway
return restTemplate.postForObject("https://ext-gateway/api/service", request,
ExtServiceResponse.class);
}
@Recover
public ExtServiceResponse recover(Exception e, ExtServiceRequest request) {
// Fallback logic after retries are exhausted
log.error("Failed after retries: {}", e.getMessage());
return new ExtServiceResponse("FAILED");
}
}
Что это делает:
▪️Делает 3 ретрая, если вылетают указанные исключения.
▪️Стартует с задержки 2 секунды и удваивает ее на каждой попытке (экспоненциальный backoff).
▪️Если все попытки провалились, вызывает recover().
👉 Java PortalКак прогревать кэши в Spring Boot?
И вообще, как делать что-то на старте приложения?
Обычно такие операции делают в
@PostConstruct или ловят событие ApplicationReadyEvent. Но у этих вариантов есть заметный минус.
Если “прогрев” лежит в @PostConstruct, как его отключать в тестах? Можно завести флаг, сделать наследника и подменять бин в тестовой конфигурации, но это не всегда помогает и часто выглядит как костыль.
Покажу более элегантный способ “прогрева кэшей”. В какой-то момент точно пригодится.
Смотри: SpringApplication.run(...) возвращает полностью готовый контекст. Из него можно получить нужный компонент и вызвать метод “прогрева”. Код выглядит так:
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(MainApplication.class, args);
AccountService accService = ctx.getBean(AccountService.class);
accService.loadDictionary();
}
}
В чём плюс?
В интеграционных тестах с @SpringBootTest метод main не запускается. Значит, код внутри не выполняется. Никаких костылей вокруг @PostConstruct, всё чисто и аккуратно.
Когда всё-таки нужно, чтобы “прогрев” выполнялся и в тестах, добавь параметр “использовать main метод”:
@SpringBootTest(useMainMethod = SpringBootTest.UseMainMethod.ALWAYS)
И всё. Если код должен выполняться после старта, но мешает тестам, клади его в main. Очень полезный приём.
👉 Java PortalJava-совет: чтобы не ловить оверхед на boxing/unboxing, используй стримы примитивов (IntStream/LongStream/DoubleStream) вместо Stream<Integer>/Stream<Long>/Stream<Double>.
❌Создаём объекты Integer для каждого значения:
Stream<Integer> boxed = Stream.of(1, 2, 3, 4, 5);
int sumBoxed = boxed.reduce(0, Integer::sum);
✅Работаем напрямую с int:
int sumPrimitive = IntStream.of(1, 2, 3, 4, 5).sum();
✅Другие примитивные стримы:
LongStream, DoubleStream
👉 Java PortalБольшинство разработчиков в Spring знают, как доставать query-параметры и path variables.
Но часто забывают, что HTTP-хедеры можно вытаскивать так же просто. В Spring для этого есть аккуратный
@RequestHeader.
Можно в одну строку получить User-Agent, Authorization или любой кастомный хедер. И не нужно лезть в HttpServletRequest.
Пример:
▪️Добавляешь в метод контроллера @RequestHeader("User-Agent") String userAgent
▪️Spring сам подхватывает значение из заголовка
▪️Ты получаешь его сразу параметром метода
Нужно сделать опциональным?
Просто добавь required = false.
Нужен дефолт?
▪️Используй defaultValue = "unknown".
▪️Очень полезно для логирования, аналитики, A/B тестов или фичефлагов, завязанных на заголовки.
▪️Выручает при работе с API-клиентами, которые шлют кастомные заголовки.
▪️Чище, короче и легче тестируется.
▪️Чем меньше зависимостей от servlet API, тем лучше.
👉 Java PortalSpring Boot: отдавай предпочтение статическим utility-классам вместо Spring-бинов только если они не хранят состояние, у них нет зависимостей и их не нужно мокать или оборачивать в AOP.
public class CacheUtils {
private static Map<String, String> cache = new HashMap<>();
...
}
// Кэш как выше разделяется между всеми потоками и может случайно изменяться
@Component
@Scope("request")
public class CacheService {
private Map<String, String> cache = new HashMap<>();
...
}
// Если оформить это как бин, можно задать ему конкретный scope.
// Spring лучше управляет объектами с состоянием.
👉 Java PortalРеальный event-driven проект на Core Java 21, Apache Kafka (KRaft mode) и PostgreSQL (в Docker).
Проект показывает, как современные распределенные системы обрабатывают заказы асинхронно через Kafka, без блокировок и ожидания между сервисами.
https://github.com/FlexiDriod/kafka-order-processing-system
👉 Java Portal
Spring Boot: можно реализовать оптимистическую блокировку через аннотацию
@Version.
✅Идеально подходит, когда:
- чтения происходят часто
- записи сравнительно редкие
- конфликты случаются нечасто
❌Не лучший вариант, когда:
- конфликты происходят часто
- нужна строгая сериализация
public class Account {
@Id
private Long id;
private BigDecimal balance;
@Version
private Long version;
}
Когда читаем, Entity загружается с текущей версией. Допустим, version = 2.
Когда делаем update, учитывается запись с version = 2.
Если за это время другая транзакция уже успела её обновить, version уже не 2, апдейт не затронет ни одной строки, и Hibernate кинет OptimisticLockException.
То есть конфликт ловится без блокировки строки.
👉 Java PortalСовет: в REST-сервисах ты часто получаешь только ID сущностей. И не всегда нужно тащить их из БД.
Чтобы проставить связь (по сути, foreign key в базе), можно “создать” ссылку на сущность через
getReferenceById(id) без SELECT и использовать её, чтобы задать relation.
@Service
public SomeService {
@Autowired
private ProductRepository productRepository;
@Autowired
private CategoryRepository featureRepository;
public void setCategory(long productId, long categoryId) {
Product product = productRepository.findById(productId).orElseThrow(); // executes SELECT
Category category = categoryRepository.getReferenceById(categoryId); // does not execute a SELECT
product.setCategory(category);
productRepository.save(product);
}
}
👉 Java Portal🔴 Завтра тестовое собеседование с Java-разработчиком
11 февраля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Сергею
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
Тонкие Docker-образы для Java: в этой статье вы узнаете, как собирать тонкие Docker-образы для ваших Java-приложений с использованием Alpine Linux и инструмента jlink.
Мы будем опираться на свежие базовые образы Java 21 от Eclipse Temurin и BellSoft Liberica. Также мы сравним этих провайдеров с Alpaquita Linux, который тоже поставляется BellSoft. В сравнение также войдет оценка безопасности на основе количества уязвимостей. В качестве примера мы возьмем простое Spring Boot-приложение, которое поднимает несколько REST-эндпоинтов.
Если вам интересна Java в контексте контейнеризации, на моем блоге вы можете найти несколько похожих статей. Например, можно почитать, как ускорить старт Java на Kubernetes с помощью CRaC в том посте. Еще есть статья, где сравниваются разные провайдеры JDK, которые используются для запуска Java-приложений в Paketo Buildpacks.
👉 Java Portal
Java-совет: используй
ThreadLocal.withInitial(...), чтобы каждому потоку задавать своё безопасное значение по умолчанию.
Значение создаётся лениво (только при первом обращении).
👉 Java PortalCodingBat Java: это сайт с интерактивными задачами по Java
👉 Java Portal
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
