問題タブ [spring-aop]
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 - 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 - SpringAOPでのBeanNotOfRequiredTypeException
私はspringaopとspringconfigファイルの下で手を試しています:
コードを実行すると、次のようなエラーが発生します。
スレッド「main」の例外org.springframework.beans.factory.BeanNotOfRequiredTypeException:「eddie」という名前のBeanはタイプ[com.springinaction.Instrumentalist]である必要がありますが、実際にはorg.springframework.beans.factoryでタイプ[$Proxy4]でした。 .support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:348)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java :1008)com.springinaction.Main.main(Main.java:12)で
<aop:config>
春の設定ファイルの要素にコメントすると、完全に実行されています。
なぜそれが起こっているのですか?
spring - SpringAOPで動作しないSpring式言語
上記のコードでは、春の表現言語を使用してBeansong
のinstrument
プロパティを注入しています。eddie
しかし、song
プロパティが適切に挿入されていません。次のエラーが発生します。
スレッド「main」の例外org.springframework.beans.factory.BeanCreationException:クラスパスリソース[spring-config.xml]で定義された「eddie」という名前のBeanの作成中にエラーが発生しました:Beanの初期化に失敗しました。ネストされた例外はorg.springframework.beans.factory.BeanExpressionExceptionです:式の解析に失敗しました。ネストされた例外はorg.springframework.expression.spel.SpelEvaluationExceptionです:EL1008E:(pos 6):フィールドまたはプロパティ「song」がorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactoryのタイプ「$Proxy4」のオブジェクトで見つかりません。 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)のdoCreateBean(AbstractAutowireCapableBeanFactory.java:519)org.springframework.beans。
楽器のプロパティは適切に挿入されますが、曲のプロパティは挿入されません。これはaopのみが原因で発生します。
コメントアウトすると、正常に機能し<aop:config>
ています。
何か問題がありますか?
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がクラスインスタンスをキャッシュしている可能性がありますか?
java - プライベート メソッドのメソッド インターセプター
ここに質問があります: 私は method を持っていますdigest(byte[] data)
。クラスの外では本当に必要ないので、プライベートにする必要がありますが、それが役立つ場合は、パブリックにしても死ぬことはありません。
問題は、どうにかしてインターセプターを接続できますか? 問題は、 のように呼び出されるのではなく、記号が smth のようにgetBean('MyBean').digest()
呼び出されることです。getBean('MyBean').sign(data)
どうも。
java - Spring AOPにプロキシクラスが必要なのはなぜですか?
AOPのプロキシクラスの責任は何ですか?その役割は何ですか?
java - spring aop を使用して date_created を自動的に設定する方法
私は java+maven+spring+hibernate でプロジェクトに取り組んでおり、saveorupdate を呼び出す前に現在の日付を POJO に自動的に割り当てたいと考えていました。new Date()
すべてのクラスのすべての date_created を作成してもかまいませんが、十分です。spring aop がそれらの点で優れていることを発見しました。
Googleで数分後、私はそれを行うための良い方法を見つけました.しかし、今までは、導入インターフェースの実装クラスであるPOJOに新しい日付を正確に割り当てる方法がわかりません.方法がわかりません意味をなすためにそれを置く.だから私の理解から、これは私が行う方法です:
ここで私が間違っていることを誰かに教えてもらえますか?または、これは私がやりたかったことを達成するための彼の間違った方法です.読んでくれてありがとう
java - Spring AOP とトランザクションはカスタム インターセプターを追加します
トランザクションに関する私の春の定義は次のように定義されています。
ここで、トランザクション インターセプターが呼び出されるたびに実行される、アプリケーションに含まれるインターセプターをいくつか追加したいと思います。つまり、ポイントカット 'defaultServiceOperation' に他のアドバイスを追加するか、'defaultTxAdvice' プリ インターセプターに追加したいと考えています。何かのようなもの:
それは可能ですか、どうすればできますか?
spring - aop.xmlの名前と場所?
LTWでaop.xmlファイルの名前を指定する方法はありますか?または別の名前と場所を定義しますか?私が使用しているソフトウェアモジュールがいくつかあり、それらはすべて異なる設定でMETA-INF/aop.xmlを使用しています。私はこれらのモジュールをWebアプリケーションに含めますが、それはすべて、展開/解凍の方法、どのaop.xmlファイルが使用されるかに依存します。したがって、長い間検索した結果、すべてのLTWウィービングがaopに依存するため、修正を行うわけではないことがわかりました。 xmlが使用されました...
基本的に、両方のaop.xmlファイルを使用する必要があります。これは、aop.xmlファイルの両方のコンテンツをマージするようなものです...
これを行う方法?エド
spring - Spring AOP に何かが欠けている
Spring (2.5) で AspectJ (1.6) をいじっているだけですが、適切に動作していないようです。以下を使用して「beans.xml」をセットアップしました。
正しい名前空間が設定され、他のいくつかの Bean は重要ではありません。単純な Bean を使用してアドバイスをテストします。
そして、これは aop Bean です。
最後に、これはテスト コードです (メイン メソッド内)。
出力は以下のみを印刷します。
奇妙なことに、ポイントカットに使用すると:
ログには、AfterReturningExample クラスの System.out.println が表示されます。私は何が欠けていますか?