2017-01-27 9 views
0

Давайте возьмем пример простой программы Spring загрузки:Как Spring Boot распознает @Scheduled по методу подкласса?

Application.java

@SpringBootApplication 
@EnableScheduling 
public class Application { 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class); 
    } 
} 

SuperClass.java

public abstract class SuperClass { 

    @Scheduled(fixedRate = 5000) 
    public void printSomething() { 
     System.out.println("this is the super method"); 
    } 
} 

SubClass.java

@Component 
public class SubClass extends SuperClass { 

} 

Согласно this ответ, только аннотации, аннотированные @Inherited наследуются подклассами, а @Scheduled не имеет такой аннотации. Так почему это работает?

ответ

2

@Inherited относится только к типам классов, а не к методам.

Обратите внимание, что этот тип мета-аннотаций не имеет никакого эффекта, если аннотированный тип используется для аннотирования ничего, кроме класса. Также обратите внимание, что эта мета-аннотация только вызывает наследование аннотаций от суперклассов; аннотации на реализованные интерфейсы не влияют.

Когда весна сканирует фасоль для аннотации @Scheduled (или других), она ищет все методы в классе bean. SubClass имеет printSomething, поэтому Spring решает, что он может улучшить его с поведением планирования.


Spring обрабатывает @Scheduled немного иначе, чем стандартный механизм проксирования и способен вызывать private методы аннотированные с ним.

Если вы переопределили метод printSomething в подклассе и пропустили аннотацию @Scheduled этого объявления, Spring не применил бы поведение планирования.

+0

Я вижу. Поэтому в ответе, с которым я связан, метод foo() не был вызван, потому что он переопределил метод super. Спасибо за разъяснения. – Ozilophile

Смежные вопросы