問題タブ [aspectj]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - パッケージ内のすべてのメソッドに対して @Around アドバイスが呼び出されていない
LoggingAspect クラスに以下のコードがあり、これが次のようなメソッドに対して実行されることを期待しています
gov.ssa.rome.service.impl.save() gov.ssa.rome.dao.impl.save()
しかし、何があっても一度だけ実行されます。どうしてか分かりません。autowire を使用して dao をサービス層に配線しました。本当にありがとうございました。
このメソッドをすべてのアプリケーション フローに対して実行して、フローをログに表示するにはどうすればよいですか?
eclipse - Petclinic spring-mvc の例がビルドされない
https://src.springframework.org/svn/spring-samples/にアクセスして、ペットクリニックを構築しようとしました。やった:
- mvn クリーン インストール
- mvn 日食: 日食
私はEclipseにインポートしましたが:
pom.xml
が間違っていて、依存関係を自分で追加しなければならない可能性はどのくらいですか?
java - 同じクラス内のメソッドによる Spring @Transaction メソッド呼び出しが機能しない?
私はSpring Transactionが初めてです。なんか変だなと思ったのですが、ちゃんと理解できたのかもしれません。
メソッドレベルでトランザクションを行いたいのですが、同じクラス内に呼び出し元メソッドがあり、それが気に入らないようです。別のクラスから呼び出す必要があります。それがどのように可能かわかりません。
誰かがこの問題を解決する方法を知っているなら、私は大いに感謝します. 同じクラスを使用して、注釈付きのトランザクション メソッドを呼び出したいと考えています。
コードは次のとおりです。
eclipse - 新しいEclipseプロジェクトを作成するときに「AspectJに変換」アクションをスクリプト化する方法は?
(ほとんど) すぐに使える Eclipse プロジェクトを作成するコマンド ライン スクリプトがあります。Maven の Eclipse プラグインを使用し、コードの標準設定をレポから .settings にコピーするなど、他のスクリプト化された手順がいくつかあります。この 1 つのテンプレートから新しいプロジェクトを頻繁に作成する必要があるため、これは非常に便利です。(ブランチ作業、1 回限りの開発実験など)
しかし、プロジェクトは AspectJ を使用します。「AspectJに変換」する必要があることをEclipseに自動的に伝える方法がわからないため、新しいプロジェクトを作成するたびにEclipse内でこれを手動で行う必要があります。
コマンドラインからEclipseプロジェクトを構成して、それ自体をAspectJプロジェクトと見なす方法はありますか? Eclipse 3.4.2 と AspectJ プラグイン 2.0.0 を使用しています。
java - メソッドの途中でクロスカットの問題
AOP (AspectJ、SpringAOP など) が、以下のメソッド周辺のポイントカットでクロスカットの問題を処理 (アドバイス) すると便利です。
「サンドイッチ」コード
AOP は、以下のユーザー コードに重複する懸念事項をクロスカットする傾向がありますか? どのように?
「スパゲッティ」コード
ありがとう!
java - Guice vs AspectJ
私は数か月前にGUiceを使用していましたが、戻ってみると、Guiceのドキュメントと例を読み直して、コードで何をしたかを理解する必要があります。
しかし、私がAspectJを見ると、それはすべて直感的すぎます。これは、Java言語の直感的な拡張です。座ってすぐにAspectJコードを書くことができると思います。
そのため、Guiceの追求を断念し、AspectJを採用したいと思っています。特にSpringがAspectJコードを生成しているという事実。
AspectJの上にGuiceのどの機能があり、Guiceを放棄するのを思いとどまらせる必要がありますか?
GoogleがGuiceを放棄して、代わりにAspectJを使用しないのはなぜですか?
逆に、Guiceの直感性に加えて、Guiceを放棄するように促すAspectJの機能は何ですか?
ここでの質問で「織り込む」ことが許可される場合、Java言語がAspectJとマージされないようにしたり、Javaの将来のバージョンで同様の「アスペクト」を提供したりすることを妨げるものは何ですか?
注:幸せなdelete-azillaをトリガーするには、この質問は一般的すぎる可能性があることに気付きます-しかし、さらに具体的な質問があれば、質問する必要はなく、自分が知らないことをgoogle/bingで確認するだけです。知る。ご覧のとおり、私のGuiceの知識はひどく劣化しているため、自分の手書きも認識できません。
java - 注釈付きパラメータを使用したポイントカットマッチング方法
次の場合、メソッドに一致するポイントカットを使用してアスペクトを作成する必要があります。
- MyAnnotationForMethodで注釈が付けられます
- そのパラメーターの1つ(多く持つことができます)は@MyAnnotationForParamで注釈が付けられます(ただし、他の注釈も持つことができます)。
アスペクトクラスは次のようになります
注釈付きの方法
日食あり->警告:ポイントカットについて:
http://download.eclipse.org/tools/ajdt/35/updateの最後のaspectJプラグインを使用する
アスペクトj1.6.9を使用したMavenコマンドラインを使用
注釈:
と
そしてもちろん、それは正しく機能しません。
何が悪いのか教えていただけますか?
どうも。
java - Spring @Transactional は、動的 Jdk プロキシとアスペクトの両方として適用されます。
@Transactional アノテーションを介して Spring 宣言型トランザクションを既存の Java プロジェクトに追加しようとしています。
問題が発生したとき (この質問とは関係ありません)、完全なデバッグ ログをオンにしました。不思議なことに、私は次のことに気付きました。
いくつかのデバッグの後、最初の 3 つのログ エントリ (スレッド バインド セッションが見つかり、そのトランザクションを使用している) が UserService クラスの JdkDynamicAopProxy によって生成されていることがわかりました。
ただし、最後のログ メッセージは驚くべきものに見えます。メソッド実行前のジョインポイントで呼び出されます。AnnotationTransactionAspect のソースを見ると、トランザクション マネージャーが設定されていない場合にこのメッセージが生成されます。この場合、Spring はこの側面で依存性注入を実行しないためです。
私には、トランザクションの 2 つの異なる「スタイル」が適用されているように見えます: 動的プロキシとアスペクトです。私が持っている唯一のトランザクション関連の構成は次のとおりです。
プロジェクトで AspectJ を使用していますが、aop.xml に AnnotationTransactionAspect アスペクトが登録されていません。Spring 3.0.2.RELEASE を使用しています。
私はこれに警戒すべきですか?Spring はこの側面を登録しますか? annotation-driven
AspectJ を使用する場合は使用しないでください。
java - AspectJロードタイムウィーバーがすべてのクラスを検出するわけではありません
Springの宣言型トランザクション(@Transactionalアノテーション)を「aspectj」モードで使用しています。ほとんどの場合、正常に機能しますが、機能しない場合もあります。私たちはそれを呼ぶことができますLang
(それが実際に呼ばれているものだからです)。
ロードタイムウィーバーに問題を特定することができました。aop.xmlでデバッグと詳細ログをオンにすることで、織り込まれているすべてのクラスが一覧表示されます。問題のあるクラスLang
は、実際にはログにまったく記載されていません。
次に、の先頭にブレークポイントを設定し、クラスがロードされるLang
ときにEclipseがスレッドを一時停止するようにします。Lang
このブレークポイントは、LTWが他のクラスを織り込んでいるときにヒットします。したがって、ウィービングLang
を試みて失敗し、それを出力しないか、または他のクラスに、Lang
実際にウィービングする機会を得る前にロードを強制する参照があると推測しています。
ただし、これを小規模に再現できないため、これをデバッグし続ける方法がわかりません。続行する方法について何か提案はありますか?
更新:他の手がかりも歓迎します。たとえば、LTWは実際にどのように機能しますか?たくさんの魔法が起こっているようです。LTWからさらに多くのデバッグ出力を取得するためのオプションはありますか?私は現在持っています:
私は前にそれについて言及するのを忘れました:春のエージェントはLTWを可能にするために使用されています、すなわちInstrumentationLoadTimeWeaver
。
Andy Clementの提案に基づいて、AspectJトランスフォーマーがクラスを通過したことがあるかどうかを調べることにしました。にブレークポイントを設定すると、他のクラス(JettyのWebAppClassLoaderのインスタンス)と同じクラスローダーによってロードされているにもかかわらずClassPreProcessorAgent.transform(..)
、クラスがそのメソッドに到達することはないようです。Lang
次に、にブレークポイントを設定しましたInstrumentationLoadTimeWeaver$FilteringClassFileTransformer.transform(..)
。その1つでさえもヒットしませんLang
。また、使用しているクラスローダーに関係なく、ロードされたすべてのクラスに対してメソッドを呼び出す必要があると思います。これは次のようになり始めています:
- デバッグに問題があります。Eclipse
Lang
がロードしていると報告したときにロードされていない可能性があります - Javaのバグ?とてつもない、しかし私はそれが起こると思います。
次の手がかり:電源を入れたところ、トランスがインストルメンテーションに追加される前に、ロードが時期尚早である-verbose:class
ように見えます。奇妙なことに、私のEclipseブレークポイントはこの読み込みをキャッチしません。Lang
これは、春が新たな容疑者であることを意味します。ConfigurationClassPostProcessor
クラスをロードしてそれらを検査する処理が行われているようです。これは私の問題に関連している可能性があります。
の次の行ConfigurationClassBeanDefinitionReader
により、Lang
クラスが読み取られます。
特に、そのクラスのすべてのメソッドのすべてのパラメータクラスをロードするクラスをmetadata.hasAnnotatedMethods()
呼び出します。getDeclaredMethods()
クラスはアンロードされるはずなので、これで問題は解決しないのではないかと思います。不明な理由でJVMがクラスインスタンスをキャッシュしている可能性がありますか?