Пример: Аспект для логирования
Создадим сервис — класс с бизнес-логикой:
Теперь аспект для логирования:
Более сложный пример: Аспект вокруг метода
Для обработки ошибок или измерения времени используй @Around — он оборачивает метод.
Продвинутые советы для опытных разработчиков
Производительность: Прокси в Spring добавляют overhead (небольшую задержку). Для критичных мест используй compile-time weaving из AspectJ.
Порядок аспектов: Если несколько аспектов на одном методе, используй @Order(1) для приоритета (меньше число — выше приоритет).
Обработка исключений: В @Around лови Throwable, логируй и перебрасывай, чтобы не глотать ошибки.
Тестирование: Используй @EnableAspectJAutoProxy в тестах, моки (заменители) для аспектов с Mockito.
Интеграция с другими модулями: Spring Security или Spring Cache часто используют АОП внутри — изучи их исходники для идей.
Ограничения: Spring AOP работает только на методах бинов (объектов, управляемых Spring). Для статических методов или конструкторов нужен AspectJ.
#Java #middle #on_request #AOP
Создадим сервис — класс с бизнес-логикой:
javaimport org.springframework.stereotype.Service;
@Service // Обозначает, что это сервис, Spring создаст экземпляр
public class MyService {
public String doSomething(String input) {
return "Результат: " + input.toUpperCase(); // Простая логика
}
}
Теперь аспект для логирования:
javaimport org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect // Это аспект
@Component // Spring зарегистрирует его
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))") // Pointcut: все методы в пакете service
public void logBefore(JoinPoint joinPoint) { // JoinPoint — информация о точке
System.out.println("Вызов метода: " + joinPoint.getSignature().getName());
System.out.println("Аргументы: " + Arrays.toString(joinPoint.getArgs()));
}
}
Здесь @Before значит "выполни перед методом". execution — выражение для pointcut: * значит любой возврат, com.example.service..(..) — любой класс в пакете service, любой метод с любыми аргументами.
Если вызвать myService.doSomething("hello"), в консоли увидишь лог перед результатом.
Более сложный пример: Аспект вокруг метода
Для обработки ошибок или измерения времени используй @Around — он оборачивает метод.
javaimport org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class TimingAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object measureTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed(); // Выполняет оригинальный метод
long end = System.currentTimeMillis();
System.out.println("Время выполнения: " + (end - start) + " мс");
return result; // Возвращает результат метода
}
}
ProceedingJoinPoint позволяет контролировать вызов: можно пропустить метод, изменить аргументы или результат. Идеально для транзакций или кэша.
Продвинутые советы для опытных разработчиков
Производительность: Прокси в Spring добавляют overhead (небольшую задержку). Для критичных мест используй compile-time weaving из AspectJ.
Порядок аспектов: Если несколько аспектов на одном методе, используй @Order(1) для приоритета (меньше число — выше приоритет).
Обработка исключений: В @Around лови Throwable, логируй и перебрасывай, чтобы не глотать ошибки.
Тестирование: Используй @EnableAspectJAutoProxy в тестах, моки (заменители) для аспектов с Mockito.
Интеграция с другими модулями: Spring Security или Spring Cache часто используют АОП внутри — изучи их исходники для идей.
Ограничения: Spring AOP работает только на методах бинов (объектов, управляемых Spring). Для статических методов или конструкторов нужен AspectJ.
#Java #middle #on_request #AOP
👍4
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ро́берт Ха́тчингс Го́ддард (англ. Robert Hutchings Goddard, 5 октября 1882 года — 10 августа 1945 года) — американский учёный, один из пионеров современной ракетной техники, создатель первого жидкостного ракетного двигателя.
2021 — состоялся релиз OC Windows 11.
#Biography #Birth_Date #Events #05Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
А сколько вы жмете от груди?
Хотите парадокс?😨
И сегодня (как понятно наверно из заголовка) я хочу поговорить с Вами о спорте и поддержании нашего мешка с костями в надлежащем состоянии.
Раньше, когда у меня практически не было свободного времени, я мечтал, что как только оно появится - я начну постоянно заниматься (возможно даже в спортзале) и поддерживать себя в форме.💪
Теперь когда я работаю на удаленке, заставить себя заниматься оказалось неожиданно сложной задачей.
Ведь хоть работа и удаленная - она все равно есть. А так же всегда есть очередное видео, по новой, неизученной технологии, которое уже долго ждет своего часа.
И по-любому надо делать выбор.
Что мы получаем от сидячей работы.
Тут наверно стоит предупредить молодых людей - вы не бессмертны.
Увы и ах🤷♀️
Поэтому, чем раньше вы задумаетесь о том в каком состоянии будет ваш организм к 40-50 годам, тем лучше (любители энергетиков привет!).
Но и тем кто сейчас вкатывается в IT стоит знать - если вы меняете активный, физический труд, на сидячий образ жизни - изменения в организме не заставят себя ждать (дружно машем геморрою и варикозу, ожирению и остаткам зрения😂 ).
И многие с пренебрежением относятся к этом, мол, "я вон худой как палка, какое ожирение, какой геморрой?"
В целом они правы, но уж точно поверьте - болячка от застоя организма найдется для каждого, если об этом не заботиться.
Что делать?
Двигаться.
Одно слово реально поможет вам не задумываться о негативных последствиях 12-часового, сидячего рабочего дня.
Как двигаться и куда - это зависит от индивидуального состояния организма.
Кто-то может 90 минут гонять по полю мяч, без особого напряжения, а кому-то 3-х километровая прогулка по парку кажется вызовом.
Поэтому по настоящему выбирать Вам.
Нужно помнить только одно - двигаться необходимо.
Цифры конечно отличаются, сколько в среднем, в зависимости от возраста и так далее. Я не собираюсь тут рассказывать КАК и СКОЛЬКО. Я просто хочу по дружески предупредить, а в остальном Вам поможет интернет, тренер или не дай бог, доктор.
Как себя заставить?
Тут вам пригодятся мои советы из предыдущих воскресных мотивационных статей по изучению Java.
Ведь это очень похоже.
Вы заставляете себя выйти из зоны комфорта, заставляете свое тело и мозг работать, чего они не хотят.
Самое главное - сделать первый шаг.
И в целом, эта статья - не попытка напугать. Я знаю множество людей которые столкнулись с проблемами при сидячем образе жизни. Добавить к этому вкусную и жирную пищу, алкоголь и сигареты - и вот кандидат к получению хронических заболеваний.
Ну и надеюсь, вы понимаете - ни одному бизнесу не нужен хронически больной работник, который регулярно ходит на больничные, не выполняет свою работу в полном объеме из-за регулярно плохого состояния и так далее.
И это относится не только к IT.
Поэтому - а сколько вы жмете от груди?💪
Берегите себя. На этом извольте откланяться - ваш @Oleborn
😎 Пишите вашем мнение в комментарии.
#мои_мысли
Хотите парадокс?
Чем больше у Вас свободного времени, тем больше интересных занятий которые пожирают все свободное время, которое вы хотели потратить на "полезные" дела.
И сегодня (как понятно наверно из заголовка) я хочу поговорить с Вами о спорте и поддержании нашего мешка с костями в надлежащем состоянии.
Раньше, когда у меня практически не было свободного времени, я мечтал, что как только оно появится - я начну постоянно заниматься (возможно даже в спортзале) и поддерживать себя в форме.
Теперь когда я работаю на удаленке, заставить себя заниматься оказалось неожиданно сложной задачей.
Ведь хоть работа и удаленная - она все равно есть. А так же всегда есть очередное видео, по новой, неизученной технологии, которое уже долго ждет своего часа.
И по-любому надо делать выбор.
Что мы получаем от сидячей работы.
Тут наверно стоит предупредить молодых людей - вы не бессмертны.
Увы и ах
Поэтому, чем раньше вы задумаетесь о том в каком состоянии будет ваш организм к 40-50 годам, тем лучше (любители энергетиков привет!).
Но и тем кто сейчас вкатывается в IT стоит знать - если вы меняете активный, физический труд, на сидячий образ жизни - изменения в организме не заставят себя ждать (дружно машем геморрою и варикозу, ожирению и остаткам зрения
И многие с пренебрежением относятся к этом, мол, "я вон худой как палка, какое ожирение, какой геморрой?"
В целом они правы, но уж точно поверьте - болячка от застоя организма найдется для каждого, если об этом не заботиться.
Что делать?
Двигаться.
Одно слово реально поможет вам не задумываться о негативных последствиях 12-часового, сидячего рабочего дня.
Как двигаться и куда - это зависит от индивидуального состояния организма.
Кто-то может 90 минут гонять по полю мяч, без особого напряжения, а кому-то 3-х километровая прогулка по парку кажется вызовом.
Поэтому по настоящему выбирать Вам.
Нужно помнить только одно - двигаться необходимо.
Цифры конечно отличаются, сколько в среднем, в зависимости от возраста и так далее. Я не собираюсь тут рассказывать КАК и СКОЛЬКО. Я просто хочу по дружески предупредить, а в остальном Вам поможет интернет, тренер или не дай бог, доктор.
Как себя заставить?
Тут вам пригодятся мои советы из предыдущих воскресных мотивационных статей по изучению Java.
Ведь это очень похоже.
Вы заставляете себя выйти из зоны комфорта, заставляете свое тело и мозг работать, чего они не хотят.
Самое главное - сделать первый шаг.
И в целом, эта статья - не попытка напугать. Я знаю множество людей которые столкнулись с проблемами при сидячем образе жизни. Добавить к этому вкусную и жирную пищу, алкоголь и сигареты - и вот кандидат к получению хронических заболеваний.
Ну и надеюсь, вы понимаете - ни одному бизнесу не нужен хронически больной работник, который регулярно ходит на больничные, не выполняет свою работу в полном объеме из-за регулярно плохого состояния и так далее.
И это относится не только к IT.
Поэтому - а сколько вы жмете от груди?
Берегите себя. На этом извольте откланяться - ваш @Oleborn
😎 Пишите вашем мнение в комментарии.
#мои_мысли
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Серге́й Льво́вич Со́болев (23 сентября [6 октября] 1908, Санкт-Петербург — 3 января 1989, Москва) — советский математик, занимавшийся математическим анализом и дифференциальными уравнениями в частных производных. Академик АН СССР (1939). Герой Социалистического Труда (1951). Лауреат трёх Сталинских премий и Государственной премии СССР.
1995 — Открыта 51 Пегаса b — первая экзопланета у звезды главной последовательности.
2000 — согласно сообщению британской компании «NetNames», зарегистрировано 30-миллионное доменное имя.
2010 — начало работу приложение по обмену фотографиями Instagram.
#Biography #Birth_Date #Events #06Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Вы умеете вайбкодить?
Anonymous Poll
41%
Да, я занимаюсь этим каждый день! ☺️
41%
Я не знаю что это 🤷♀️
17%
Я против этого! Vim forever 😈
🗿1
Реактивное программирование
Базовые операторы в Reactor: map, filter, flatMap
Операторы — это методы на Mono/Flux, которые позволяют строить конвейеры: преобразовывать, фильтровать и комбинировать данные асинхронно. Представьте их как звенья в цепи: каждый берёт входной поток, меняет его и передаёт дальше. Сегодня разберём три фундаментальных: map (преобразование элементов), filter (фильтрация) и flatMap (плоское преобразование, для слияния подпотоков). Эти операторы — основа для сложных сценариев, они решают проблемы из первого поста, позволяя писать декларативный код вместо ручных циклов и ожиданий.
Операторы в Reactor — декларативные: вы описываете, что делать с данными, а библиотека заботится об асинхронности, backpressure и ошибках. Они не меняют исходный поток (иммутабельны), а создают новый. Это делает код читаемым и тестируемым.
Map: простое преобразование элементов
Map — оператор для изменения каждого элемента потока. Он берёт входной элемент, применяет функцию и выдаёт результат. Синхронный: функция должна быть быстрой и без блокировок. Идеален для конвертации типов, вычислений или форматирования.
Пример на Flux:
На Mono:
Почему map полезен? В традиционных подходах (как в CompletableFuture.thenApply) вы строите цепочки, но рискуете вложенностью. В Reactor map делает конвейер линейным: читается как последовательный код, но работает асинхронно. Поддерживает backpressure: если подписчик запрашивает n, map передаёт запрос upstream (источнику).
Filter: отбор элементов по условию
Filter — для пропуска только нужных элементов. Принимает предикат (функцию, возвращающую true/false) и пропускает те, для которых true. Остальные игнорируются — поток "сужается".
Пример на Flux:
На Mono:
Filter экономит ресурсы: ненужные элементы не обрабатываются дальше в цепи. В отличие от императивных циклов (где вы фильтруете в for с if), здесь всё асинхронно и с backpressure — запросы передаются источнику только для прошедших элементов.
Комбинация с map: numbers.filter(num -> num > 5).map(num -> num * 10).subscribe(); // 60, 70, 80, 90, 100
Это строит конвейер: фильтр → преобразование, без ручных переменных.
#Java #middle #Reactor #map #filter #flatMap
Базовые операторы в Reactor: map, filter, flatMap
Операторы — это методы на Mono/Flux, которые позволяют строить конвейеры: преобразовывать, фильтровать и комбинировать данные асинхронно. Представьте их как звенья в цепи: каждый берёт входной поток, меняет его и передаёт дальше. Сегодня разберём три фундаментальных: map (преобразование элементов), filter (фильтрация) и flatMap (плоское преобразование, для слияния подпотоков). Эти операторы — основа для сложных сценариев, они решают проблемы из первого поста, позволяя писать декларативный код вместо ручных циклов и ожиданий.
Операторы в Reactor — декларативные: вы описываете, что делать с данными, а библиотека заботится об асинхронности, backpressure и ошибках. Они не меняют исходный поток (иммутабельны), а создают новый. Это делает код читаемым и тестируемым.
Map: простое преобразование элементов
Map — оператор для изменения каждого элемента потока. Он берёт входной элемент, применяет функцию и выдаёт результат. Синхронный: функция должна быть быстрой и без блокировок. Идеален для конвертации типов, вычислений или форматирования.
Пример на Flux:
import reactor.core.publisher.Flux;
Flux<String> originalFlux = Flux.just("яблоко", "банан", "вишня");
Flux<String> transformed = originalFlux.map(fruit -> fruit.toUpperCase()); // Преобразование в верхний регистр
transformed.subscribe(System.out::println); // Вывод: "ЯБЛОКО", "БАНАН", "ВИШНЯ"
Здесь map применяет лямбду к каждому элементу последовательно. Если ошибка в функции — сработает onError.
На Mono:
Mono<Integer> num = Mono.just(5).map(x -> x * 2); // Результат: 10
Почему map полезен? В традиционных подходах (как в CompletableFuture.thenApply) вы строите цепочки, но рискуете вложенностью. В Reactor map делает конвейер линейным: читается как последовательный код, но работает асинхронно. Поддерживает backpressure: если подписчик запрашивает n, map передаёт запрос upstream (источнику).
Filter: отбор элементов по условию
Filter — для пропуска только нужных элементов. Принимает предикат (функцию, возвращающую true/false) и пропускает те, для которых true. Остальные игнорируются — поток "сужается".
Пример на Flux:
Flux<Integer> numbers = Flux.range(1, 10);
Flux<Integer> evenNumbers = numbers.filter(num -> num % 2 == 0); // Только чётные
evenNumbers.subscribe(System.out::println); // Вывод: 2, 4, 6, 8, 10
Если поток пустой или ничего не проходит — onComplete сработает без onNext.
На Mono:
Mono<String> word = Mono.just("привет").filter(w -> w.length() > 7); // Не пройдёт — пустой Mono
Filter экономит ресурсы: ненужные элементы не обрабатываются дальше в цепи. В отличие от императивных циклов (где вы фильтруете в for с if), здесь всё асинхронно и с backpressure — запросы передаются источнику только для прошедших элементов.
Комбинация с map: numbers.filter(num -> num > 5).map(num -> num * 10).subscribe(); // 60, 70, 80, 90, 100
Это строит конвейер: фильтр → преобразование, без ручных переменных.
#Java #middle #Reactor #map #filter #flatMap
👍2
FlatMap: плоское преобразование для асинхронных подпотоков
FlatMap — мощный оператор для случаев, когда из одного элемента нужно создать подпоток (Publisher), и слить их в плоский результат. Это как map, но для асинхронных или множественных выходов: он "разворачивает" вложенные потоки. Полезен для запросов в цикле: например, для каждого пользователя — асинхронно запросить данные.
Пример на Flux:
Асинхронный пример: симулируем API-запросы.
Почему flatMap решает проблемы? В традиционных подходах (циклы с Future) вы ждёте каждый запрос, блокируя. Здесь — асинхронное слияние, без ожиданий и callback-ада: цепочка читаема.
Практические советы и подводные камни
Читаемость: цепочки операторов пишите по строкам для ясности: flux.filter(...).map(...).flatMap(...);
Ошибки: если в map/flatMap исключение — onError. Используйте handle() для условной обработки.
Производительность: в flatMap устанавливайте concurrency (default 256) для контроля параллелизма: flatMap(func, 4) — max 4 подпотока одновременно.
Камень: блокирующий код в лямбдах — сломает асинхронность. Для IO — используйте flatMap с Mono.fromCallable и publishOn(Schedulers.boundedElastic()).
Тестирование: StepVerifier.create(flux.map(...)).expectNext("ЯБЛОКО").verifyComplete();
#Java #middle #Reactor #map #filter #flatMap
FlatMap — мощный оператор для случаев, когда из одного элемента нужно создать подпоток (Publisher), и слить их в плоский результат. Это как map, но для асинхронных или множественных выходов: он "разворачивает" вложенные потоки. Полезен для запросов в цикле: например, для каждого пользователя — асинхронно запросить данные.
Пример на Flux:
Flux<String> fruits = Flux.just("яблоко", "банан");
Flux<Character> letters = fruits.flatMap(fruit -> Flux.fromArray(fruit.toCharArray())); // Из строки — поток символов
letters.subscribe(System.out::println); // Вывод: я, б, л, о, к, о, б, а, н, а, н (в возможном перемешанном порядке, если асинхронно)
Здесь flatMap берёт строку, создаёт Flux из символов и сливает всё в один поток. В отличие от map (который вернул бы Flux<Flux<Character>> — вложенный), flatMap "сплющивает".
Асинхронный пример: симулируем API-запросы.
import java.time.Duration;
Flux<String> users = Flux.just("user1", "user2");
Flux<String> data = users.flatMap(user -> Mono.just("Данные для " + user).delayElement(Duration.ofSeconds(1))); // Асинхронный подпоток с задержкой
data.subscribe(System.out::println); // Вывод через секунды: "Данные для user1", "Данные для user2" (параллельно, если scheduler позволяет)
FlatMap уважает backpressure: запрашивает у подпотоков по мере нужды. Но осторожно: если подпотоки бесконечные — рискуете перегрузкой. Параметр concurrency (flatMap(func, concurrency)) ограничивает параллелизм.
Почему flatMap решает проблемы? В традиционных подходах (циклы с Future) вы ждёте каждый запрос, блокируя. Здесь — асинхронное слияние, без ожиданий и callback-ада: цепочка читаема.
Практические советы и подводные камни
Читаемость: цепочки операторов пишите по строкам для ясности: flux.filter(...).map(...).flatMap(...);
Ошибки: если в map/flatMap исключение — onError. Используйте handle() для условной обработки.
Производительность: в flatMap устанавливайте concurrency (default 256) для контроля параллелизма: flatMap(func, 4) — max 4 подпотока одновременно.
Камень: блокирующий код в лямбдах — сломает асинхронность. Для IO — используйте flatMap с Mono.fromCallable и publishOn(Schedulers.boundedElastic()).
Тестирование: StepVerifier.create(flux.map(...)).expectNext("ЯБЛОКО").verifyComplete();
#Java #middle #Reactor #map #filter #flatMap
👍3
Что выведет код?
#Tasks
import java.util.*;
public class Task061025 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
for (Integer num : list) {
if (num == 3) {
list.remove(num);
}
}
System.out.println(list);
}
}
#Tasks
👍1
Варианты ответа:
Anonymous Quiz
33%
[1, 2]
4%
[1, 3]
13%
[1, 2, 3]
50%
ConcurrentModificationException
👍2
Вопрос с собеседований
Что произойдет, если в finally есть return?🤓
Ответ:
Если в finally прописан return , то он переопределит любые значения, возвращаемые в try или catch.
Это считается плохой практикой, так как затрудняет понимание кода и может скрывать исключения, которые должны были выброситься.
#собеседование
Что произойдет, если в finally есть return?
Ответ:
Это считается плохой практикой, так как затрудняет понимание кода и может скрывать исключения, которые должны были выброситься.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Джон Эдвард Хопкрофт (родился 7 октября 1939 года) — американский теоретик компьютерных наук, лауреат премии Тьюринга 1986 за фундаментальные достижения в алгоритмах и структурах данных.
Ви́ктор Леони́дович Матро́сов (7 октября 1950, Москва — 19 января 2015, Московская область) — советский / российский математик; профессор, доктор физико-математических наук.
1959 — космический аппарат «Луна-3» впервые совершил облёт Луны. Аппарат сделал первые фотоснимки её обратной стороны и передал изображения на Землю.
#Biography #Birth_Date #Events #07Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4