2017-11-02 6 views
0

注釈の設定されたアスペクトが、cronのメソッドに設定されていると機能しないのはなぜですか?AspectがScheduledからメソッドを取得しない

@Component 
public class MyClass { 
    @Scheduled(cron = "0/5 * * * * ?") 
    public void schedule() { 
    myMethod("test"); 
    } 

    @MyAnno(cl = MyClass.class, description = "desc") 
    private void myMethod(String text) { 

    } 
} 

@Aspect 
@Component 
public MyAscpect { 
    @Before("@annotation(myAnnoAnnotation)") 
    public void myAnnoAspect(JoinPoint jp, MyAnno myAnnoAnnotation) { 
} 
+0

正確にここでの質問です。あなたは明確になることができますか?あなたは '@ scehduled'を別のメソッドに、' @ MyAnno'を別のメソッドに持っています。どのように重要ですか? – pvpkiran

+0

メソッドmyAnnoAspectは、myMethod.Iを呼び出した後に実行されることはありません。別の注釈と同じクラス構造を持ち、動作します(@Scheduledなし)。 –

+0

あなたは '@ Before' Annotationを持っています。これは' myAnnoAspect'が 'myMethod'の前に実行されるべきことを意味します。 – pvpkiran

答えて

0

春AOP

ここにより、SpringのAOPフレームワーク、ターゲット内呼び出しのプロキシベースの性質のためにあなたが春AOPについて覚えておく必要がある点は、

  1. ですオブジェクトは定義によってですは傍受されませんJDKプロキシについては

  2. 、プロキシ上のみ公共インタフェースのメソッド呼び出しは、を傍受することができます。 CGLIBと、公共保護方法は、プロキシを呼び出しを傍受し、さらにパッケージ可視方法必要に応じて説明します。

あなたはhere詳細を見つけることができます。

  • あなたの方法myMethodプライベートあるので、myMethodの呼び出しが傍受されることはありません。上記の第2ポイントを参照してください。
  • あなたmyMethod公共た場合でも通話がschedule方法を経由して行われた場合、myMethodの呼び出しが傍受されていません。上記の最初のポイントを参照してください。
  • myMethodpublicの場合、myMethodメソッドがオブジェクトの外側から直接呼び出された場合、myMethodへの呼び出しが傍受されます。

AspectJのソースウィービング

ただし、AspectJのソース織りを利用することにより、プライベートメソッドをインターセプトすることができます。ソースウィービングでは、ウィーバーはコンパイラの一部になります。 ウィーバーは、ソースコードを処理し、織りJavaバイトコードを生成することによって、コンパイラーとして機能します。 javacコンパイラの代わりに、ajcコンパイラを使用します。ここで

は、あなたが確認する必要があり、変更されている:以下に示すように

  • は、あなたのpom.xml
  • プライベート方法を含むようにMyAspectのポイントカットへの変更をMavenのaspectj-maven-pluginプラグインを追加します。

    @Component 
    @Aspect 
    public class MyAspect { 
    
        @Before("@annotation(myAnnoAnnotation) && execution(private * *(..))") 
        public void myAnnoAspect(JoinPoint jp, MyAnno myAnnoAnnotation) { 
        ... 
        } 
    } 
    

    完全な作業例hereがあります。

関連する問題