То, что вы спрашиваете, не является тривиальным, но Аспектно-ориентированное программирование (AoP) является одним из способов достижения этого.В этом описании предполагается, что вы в некоторой степени знакомы с классом Proxy, интерфейсом InvocationHandler и шаблоном Interceptor в целом.Как я уже сказал, это не совсем тривиальный вопрос.
Определите логику, которую вы должны выполнять перед каждым методом, каким-либо методом или чем-то еще.Обычно это какой-то перехватчик, это пример:
public class TimeProfilerInterceptor implements MethodInterceptor {
@Getter
private final TimeStatistics statistics = new TimeStatistics();
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
StopWatch watch = new StopWatch();
try {
watch.start();
Object returnValue = invocation.proceed();
return returnValue;
}
finally {
// etc...
}
}
}
Определите место, где ваша логика связана с вашими методами.В этом примере место представляет собой компонент Spring, который расширяет AbstractBeanFactoryAwareAdvisingPostProcessor
и реализует InitializingBean
.Метод afterPropertiesSet
вызывается Spring после завершения инициализации компонента.В методе используется класс Advice
из spring-aop
для идентификации точек, т. Е. Методов, которые должны быть обернуты перехватчиком.В данном случае это точечный вырез на основе аннотации, что означает, что он соответствует каждому методу, для которого имеется определенная пользовательская аннотация (TimeProfiled
).
@Component
public class TimeProfiledAnnotationPostProcessor
extends AbstractBeanFactoryAwareAdvisingPostProcessor
implements InitializingBean {
@Autowired
TimeProfilerInterceptor timeProfilerInterceptor;
@Override
public void afterPropertiesSet() throws Exception {
this.setProxyTargetClass(true);
Advice advice = timeProfilerInterceptor;
Pointcut pointcut = new AnnotationMatchingPointcut(null, TimeProfiled.class);
this.advisor = new DefaultPointcutAdvisor(pointcut, advice);
}
}
Определите свою пользовательскую аннотациюиспользовать там, где необходимо.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TimeProfiled {
}
Скажите Spring, чтобы при запуске запускался механизм обмотки с помощью следующей аннотации для конфигурации Spring или SpringBootApplication:
@ComponentScan(basePackageClasses = TimeProfiledAnnotationPostProcessor.class)
@EnableAspectJAutoProxy(proxyTargetClass = true)
Вы можете изменить pointcut так, чтобы он соответствовал другим методам с другими критериями, для этого существует целый синтаксис, сам по себе мир, это всего лишь небольшой пример ...