Куда писать общий код при весенней загрузке - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу написать общий код, который должен выполняться перед каждым методом, Где я могу разместить этот код весной.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

То, что вы спрашиваете, не является тривиальным, но Аспектно-ориентированное программирование (AoP) является одним из способов достижения этого.В этом описании предполагается, что вы в некоторой степени знакомы с классом Proxy, интерфейсом InvocationHandler и шаблоном Interceptor в целом.Как я уже сказал, это не совсем тривиальный вопрос.

  1. Определите логику, которую вы должны выполнять перед каждым методом, каким-либо методом или чем-то еще.Обычно это какой-то перехватчик, это пример:

    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...
            }
        }
    }
    
  2. Определите место, где ваша логика связана с вашими методами.В этом примере место представляет собой компонент 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);
        }
    }
    
  3. Определите свою пользовательскую аннотациюиспользовать там, где необходимо.

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TimeProfiled {
    
    }
    
  4. Скажите Spring, чтобы при запуске запускался механизм обмотки с помощью следующей аннотации для конфигурации Spring или SpringBootApplication:

    @ComponentScan(basePackageClasses = TimeProfiledAnnotationPostProcessor.class)
    @EnableAspectJAutoProxy(proxyTargetClass = true)
    

Вы можете изменить pointcut так, чтобы он соответствовал другим методам с другими критериями, для этого существует целый синтаксис, сам по себе мир, это всего лишь небольшой пример ...

0 голосов
/ 12 ноября 2018

Вы должны взглянуть на Spring AOP .В Spring AOP вы можете написать Аспекты, которые могут быть общим кодом, который выполняется до / после метода.В следующем примере показан простой аспект:

@Aspect
public class EmployeeAspect {

    @Before("execution(public String getName())")
    public void getNameAdvice(){
        System.out.println("Executing Advice on getName()");
    }

    @Before("execution(* your.package.name.*.get*())")
    public void getAllAdvice(){
        System.out.println("Service method getter called");
    }
}

В аннотации @Before() вы можете указать точный метод, заключенный в аспект, или использовать подстановочный знак * для указания других методов.Для этого вам следует ознакомиться с выражениями Pointcut .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...