Прежде всего, такая функциональность уже существует.Spring Boot интегрируется с платформой Micrometer, которая допускает такой тип поведения (Spring Boot 1.x использует метрики dropwizard с дополнительной поддержкой обратного порта микрометра, и оба допускают этот декларативный стиль аннотаций).
Здесь isсоответствующий раздел документации по микрометрам.
На сегодняшний день это лучший вариант, который я знаю, однако, если вы все же предпочитаете делать свой собственный (причина может быть в том, что все эти измерительные структуры поддерживают некоторую математическую модель (со скользящим окном ивсе) вокруг метрик, и если вы хотите что-то, что больше похоже на профилирование для целей отладки или что-то еще, вы можете подумать о том, чтобы делать свои собственные вещи).
Теперь слово о Spring AOP, предложенное другими ответами.Я (и это только мое мнение) думаю, что в этом случае использование постпроцессоров бинов имеет преимущество перед АОП.Прежде всего, может быть, вы вообще не используете пружинный AOP, только обычная пружина.Вторая причина выбора такого стиля реализации - производительность, AOP добавляет довольно много вызовов в стек.Очевидным преимуществом AOP является простота реализации.
Итак, давайте предположим, что вы действительно хотите способ BPP:
Я думаю, прежде всего вы должны проверить, что Bean Post Processor "распознается""к весне во время запуска приложения.
Чтобы проверить это, вы можете создать в BPP конструктор без аргументов и напечатать что-то вроде" Hello from BPP "или использовать отладчик.
Теперь по поводу предлагаемой реализации: вам нужно перебрать методы и создать прокси только один раз.Нет смысла создавать прокси поверх прокси поверх прокси .... Так что представленный код неверен.
Я думаю, вам следует перебрать методы, подготовить список методов и запомнить этот набор, затем создать проксиу него будет метод invoke
, который будет проверять, входит ли метод в набор методов, и если да, то использовать прокси-магию, в противном случае просто делегируйте вызов базовому компоненту.
При переходе по этому пути следует помнить две вещи:
Прокси не будет работать с реальными классами, только с интерфейсом.Если у вас есть класс и вы не работаете с интерфейсом, вам нужно поиграться с CGLIB
Другие постпроцессоры бинов также могут обернуть ваш бин в некоторый прокси, например, чтоесли вы измеряете метод, помеченный @Transactional
?