Как на самом деле работает @Scheduled от Spring?

#java #spring #aop

#java #spring #aop

Вопрос:

Я всегда думал, что @Scheduled это работает путем проксирования всего компонента, так же @Async , @Transactional как и , И т. Д. Итак, я был удивлен, что следующее работает как шарм:

     @Component
    public static class Bean {

        @Scheduled(fixedRate = 1000)
        private void scheduled() {
            System.out.println("Yo");
        }
    }
 

Они что-то изменили или так было с самого начала?
Спасибо.

Ответ №1:

В нескольких словах, с максимально простой конфигурацией, когда Spring обнаруживает @EnableScheduling аннотацию, он создает новую ScheduledAnnotationBeanPostProcessor , которая способна обрабатывать @Scheduled аннотации. После нахождения @Scheduled аннотаций с использованием отражения он прочитает их конфигурацию, а затем зарегистрирует их для вызова TaskScheduler . A ScheduledTaskRegistrar используется, чтобы помочь отправить задачу в ScheduledThreadPoolExecutor .

Как вы можете видеть, прокси-сервер не создается.

Комментарии:

1. Интересно, спасибо. Однако мне это кажется немного запутанным. Я имею в виду, что вы ожидаете, что он будет согласован с другими. В любом случае, я думаю, имеет смысл избегать ненужных прокси, когда это возможно.