2017-03-16 5 views
2

私はSpring AOPがプライベートとプロテクトメソッドを傍受することはできませんが、奇妙な方法でそれらを傍受しているのはなぜですか?Spring AOPが特定の状況下で保護されたメソッドをインターセプトするのはなぜですか?

私は私が傍受したい、これらの機能があります。

@Aspect 
public class Logging { 

    @Before("execution(* com.tutorialspoint.Student.*Name*(..))") 
    public void beforeAdvice(JoinPoint joinPoint){ 
     System.out.println("Going to setup student profile."+joinPoint.getSignature().toString()); 
    } 
} 

このコードが実行されると、私はこのコードを実行する際のgetNameとgetNamesprotected両方が傍受されますが、:これは私の@Aspectコードです

public String getName(String string) { 
    System.out.println("Name : " + name + string); 
    return name; 
} 

protected String getNamesprotected(String string) { 
    System.out.println("Name : " + name + string); 
    return name; 
} 

を:

@Aspect 
public class Logging { 

    @Before("execution(* com.tutorialspoint.Student.getNamesprotected(..))") 
    public void beforeAdvice1(JoinPoint joinPoint){ 
     System.out.println("Going to setup student profile."+joinPoint.getSignature().toString()); 
    } 
} 

何も傍受されません。また、getNamesprotected*getNamesprotected*に置き換えようとしましたが、依然として傍受されません。 *Name*がそこにいるときに傍受するだけです。

これはなぜ起こっているのですか?

+2

あなたが記述するものは、Spring AOPの代わりにAspectJを使用しない限り、信じられません。私はあなたが間違いを犯したと思う。 Spring AOPは決して保護されたメソッドを傍受しません。まだそれがそうだと思うなら、GitHubの[SSCCE](http://sscce.org/)でそれを証明してください。それから私は見て喜んでだろう。 – kriegaex

+0

SSCCEの例を挙げることができますか?私はここに新しいので、正確に1つを作成する方法を知っていない。 –

+1

あなたは深刻ですか?あなたはリンクをたどってSSCCEの意味を読んだことがありますか?それでは、それが何を意味しているのか、自分のコードから作成する方法を理解できなければ、ソフトウェア開発者としての才能の欠如に悩まされ、新しい仕事を見つけようとするか、単に怠け者に過ぎないでしょう。私はあなたに疑念の恩恵を与えることを選択し、あなたが悪い開発者であると考えることを拒否します。したがって、私は怠惰があなたの問題だと結論づけます。だから、敬意を表して、脳を入れ替えて、他の人があなたの質問に答えるのを手助けしようと思いますか? – kriegaex

答えて

6

OP(Prateekグプタので、 )少し問題を再現することができません(むしろむしろ)少し問題を再現することができないと思われ、私はちょうど茶の休憩中に退屈だった、私はすぐに自分自身で春のブートを作成し、非常に驚​​いた、少なくとも一定の範囲内でCGLIBプロキシが関与している場合、保護されたメソッドと照合します。

こうして、私はSpringのJira問題トラッカーのアカウントを登録し、この回帰をSPR-15354と報告しました。 Spring開発チームの回答に興味があれば、そのチケットのアップデートを購読したいかもしれません。


アップデート:私のチケットに答える人は、これを文書化の問題であることを私に言った。 2006年のSPR-1611によれば、これは既にSpring 1.2.7のために変更されていましたが、ドキュメントへの道は決して見つけられませんでした。ボトムライン:保護されたメソッドはSpring AOPを介して取得できますが、事故ではありませんが、12年間は文書化されていません。


アップデート2:更新されたドキュメントのテキストは、次の春のリリースになります。今日固定テキストを読む場合は、SPR-1611となります。

+0

答えをありがとう。そして私が怠け者ではないことを明確にするために、私は今業界を初めて卒業したばかりではないということです。以前はGitHubを使用していませんでしたし、どちらもStackOverflowを使用していませんでした。私の人生で業界で働いているのは初めて(インターンシップの1ヶ月)です。私はSSCCEのマニュアルを読んで、それが何であるかを理解しましたが、GitHubについてはわからないので、私はそれがどのように行われたかを少なくとも理解できるようにサンプルを求めたのです。 –

+3

親愛なるPrateekさん、あなたの問題を再現する小さな、最小限に抑えられた、スタンドアロンの例の作成に関して、業界や新しくStackOverflowにいかがですか?私はそれを見ることができません。申し訳ありませんが、コードに再現可能な問題がある場合は、大きなプロジェクトからその最小限のバージョンを小さなものに抽出することもできます。あなたがそれを行うために卒業する必要はありません。あなたのコードをGitリポジトリにチェックできることは、そのような基本的な開発スキルです。どの開発者も、どのようにそれなしで生き残ることができますか?あなたは1日でそれを学ぶことができます。 – kriegaex

+0

新しいチケットのステータスと説明で自分の答えを更新しました。 – kriegaex

1

これはなぜ起こっているのですか?

により、SpringのAOPフレームワークのプロキシベースの性質のために、保護されたメソッドが定義によって傍受されていない、どちらもJDKプロキシの(これは適用されない場合)でもCGLIBプロキシの(これは技術的に可能ですが、ないところAOPの目的にはお勧めできます)。

結果として、任意の与えられたポイントカットはパブリックメソッドとのみ一致します!

傍受の必要性に保護されたメソッドまたはコンストラクタが含まれている場合は、SpringのプロキシベースのAOPフレームワークではなく、SpringドリブンのネイティブAspectJ織りの使用を検討してください。

このコードは、のgetNameとgetNamesprotected両方実行されると は、先行するワイルドカードは任意の改質剤(パブリック、保護、およびプライベート)と、任意の戻り型を有するメソッドに一致ここ

@Before("execution(* com.tutorialspoint.Student.*Name*(..))") 

を傍受しています。引数リストの2つの点は、任意の数の引数と一致します。

それはあなたのために働く場合も、あなたはこれを試すことができ、それはあなたの保護方法

@Pointcut("execution(protected * *.*(..))") 

を実行する必要があり、これを試してみてください(私は100%を確認していない)

@Before("execution(* com.tutorialspoint.Student+.getNamesprotected(..))") 
+3

あなたの言うことは間違いありませんが、OPのオリジナルの質問には答えません。 – kriegaex

+0

@Pointcut( "実行*保護された* * *(..))") 'も' @Before( "実行(* com.tutorialspoint.Student + .getNamesprotected(..))") 'は、保護されたメソッドは、私の質問で '* Name *'のみが、AOPを使用しているので理想的には起こらないはずのprotectedをインターセプトしています。 –

関連する問題