2017-01-27 14 views
0

のは、シンプルな春のブートプログラムの例を見てみましょう:Springブートはサブクラスのメソッドで@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は、メソッドではなくクラスの種類にのみ適用されます。

注釈付きの タイプをクラス以外のものに注釈する場合、このメタ注釈タイプは効果がありません。 このメタ注釈は、注釈が スーパークラスから継承されるだけです。実装されたインタフェースのアノテーションは効果がありません。

Springが@Scheduledアノテーション(またはその他)のBeanをスキャンすると、Beanクラス内のすべてのメソッドが検索されます。​​にはprintSomethingがあるため、Springはスケジューリング動作で拡張できると判断します。


春は少し異なり、標準のプロキシメカニズムより@Scheduledを処理し、それに注釈を付けprivateメソッドを呼び出すことができます。

サブクラスのprintSomethingメソッドをオーバーライドし、その宣言の@Scheduled注釈を省略した場合、Springはスケジューリング動作を適用しませんでした。

+0

です。したがって、私がリンクした答えでは、foo()メソッドはスーパーメソッドをオーバーライドしているため呼び出されませんでした。説明をありがとう。 – Ozilophile

関連する問題