問題タブ [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.

0 投票する
2 に答える
7113 参照

java - Spring @Transactional は、動的 Jdk プロキシとアスペクトの両方として適用されます。

@Transactional アノテーションを介して Spring 宣言型トランザクションを既存の Java プロジェクトに追加しようとしています。

問題が発生したとき (この質問とは関係ありません)、完全なデバッグ ログをオンにしました。不思議なことに、私は次のことに気付きました。

いくつかのデバッグの後、最初の 3 つのログ エントリ (スレッド バインド セッションが見つかり、そのトランザクションを使用している) が UserService クラスの JdkDynamicAopProxy によって生成されていることがわかりました。

ただし、最後のログ メッセージは驚くべきものに見えます。メソッド実行前のジョインポイントで呼び出されます。AnnotationTransactionAspect のソースを見ると、トランザクション マネージャーが設定されていない場合にこのメッセージが生成されます。この場合、Spring はこの側面で依存性注入を実行しないためです。

私には、トランザクションの 2 つの異なる「スタイル」が適用されているように見えます: 動的プロキシとアスペクトです。私が持っている唯一のトランザクション関連の構成は次のとおりです。

プロジェクトで AspectJ を使用していますが、aop.xml に AnnotationTransactionAspect アスペクトが登録されていません。Spring 3.0.2.RELEASE を使用しています。

私はこれに警戒すべきですか?Spring はこの側面を登録しますか? annotation-drivenAspectJ を使用する場合は使用しないでください。

0 投票する
1 に答える
6350 参照

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>春の設定ファイルの要素にコメントすると、完全に実行されています。

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

0 投票する
1 に答える
4507 参照

spring - SpringAOPで動作しないSpring式言語

上記のコードでは、春の表現言語を使用してBeansonginstrumentプロパティを注入しています。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>ています。

何か問題がありますか?

0 投票する
3 に答える
6383 参照

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。また、使用しているクラスローダーに関係なく、ロードされたすべてのクラスに対してメソッドを呼び出す必要があると思います。これは次のようになり始めています:

  1. デバッグに問題があります。EclipseLangがロードしていると報告したときにロードされていない可能性があります
  2. Javaのバグ?とてつもない、しかし私はそれが起こると思います。

次の手がかり:電源を入れたところ、トランスがインストルメンテーションに追加される前に、ロードが時期尚早である-verbose:classように見えます。奇妙なことに、私のEclipseブレークポイントはこの読み込みをキャッチしません。Lang

これは、春が新たな容疑者であることを意味します。ConfigurationClassPostProcessorクラスをロードしてそれらを検査する処理が行われているようです。これは私の問題に関連している可能性があります。


の次の行ConfigurationClassBeanDefinitionReaderにより、Langクラスが読み取られます。

特に、そのクラスのすべてのメソッドのすべてのパラメータクラスをロードするクラスをmetadata.hasAnnotatedMethods()呼び出します。getDeclaredMethods()クラスはアンロードされるはずなので、これで問題は解決しないのではないかと思います。不明な理由でJVMがクラスインスタンスをキャッシュしている可能性がありますか?

0 投票する
4 に答える
6578 参照

java - プライベート メソッドのメソッド インターセプター

ここに質問があります: 私は method を持っていますdigest(byte[] data)。クラスの外では本当に必要ないので、プライベートにする必要がありますが、それが役立つ場合は、パブリックにしても死ぬことはありません。
問題は、どうにかしてインターセプターを接続できますか? 問題は、 のように呼び出されるのではなく、記号が smth のようにgetBean('MyBean').digest()呼び出されることです。getBean('MyBean').sign(data)

どうも。

0 投票する
1 に答える
847 参照

java - Spring AOPにプロキシクラスが必要なのはなぜですか?

AOPのプロキシクラスの責任は何ですか?その役割は何ですか?

0 投票する
1 に答える
1203 参照

java - spring aop を使用して date_created を自動的に設定する方法

私は java+maven+spring+hibernate でプロジェクトに取り組んでおり、saveorupdate を呼び出す前に現在の日付を POJO に自動的に割り当てたいと考えていました。new Date()すべてのクラスのすべての date_created を作成してもかまいませんが、十分です。spring aop がそれらの点で優れていることを発見しました。
Googleで数分後、私はそれを行うための良い方法を見つけました.しかし、今までは、導入インターフェースの実装クラスであるPOJOに新しい日付を正確に割り当てる方法がわかりません.方法がわかりません意味をなすためにそれを置く.だから私の理解から、これは私が行う方法です:

ここで私が間違っていることを誰かに教えてもらえますか?または、これは私がやりたかったことを達成するための彼の間違った方法です.読んでくれてありがとう

0 投票する
1 に答える
2955 参照

java - Spring AOP とトランザクションはカスタム インターセプターを追加します

トランザクションに関する私の春の定義は次のように定義されています。

ここで、トランザクション インターセプターが呼び出されるたびに実行される、アプリケーションに含まれるインターセプターをいくつか追加したいと思います。つまり、ポイントカット 'defaultServiceOperation' に他のアドバイスを追加するか、'defaultTxAdvice' プリ インターセプターに追加したいと考えています。何かのようなもの:

それは可能ですか、どうすればできますか?

0 投票する
2 に答える
4269 参照

spring - aop.xmlの名前と場所?

LTWでaop.xmlファイルの名前を指定する方法はありますか?または別の名前と場所を定義しますか?私が使用しているソフトウェアモジュールがいくつかあり、それらはすべて異なる設定でMETA-INF/aop.xmlを使用しています。私はこれらのモジュールをWebアプリケーションに含めますが、それはすべて、展開/解凍の方法、どのaop.xmlファイルが使用されるかに依存します。したがって、長い間検索した結果、すべてのLTWウィービングがaopに依存するため、修正を行うわけではないことがわかりました。 xmlが使用されました...

基本的に、両方のaop.xmlファイルを使用する必要があります。これは、aop.xmlファイルの両方のコンテンツをマージするようなものです...

これを行う方法?エド

0 投票する
1 に答える
309 参照

spring - Spring AOP に何かが欠けている

Spring (2.5) で AspectJ (1.6) をいじっているだけですが、適切に動作していないようです。以下を使用して「beans.xml」をセットアップしました。

正しい名前空間が設定され、他のいくつかの Bean は重要ではありません。単純な Bean を使用してアドバイスをテストします。

そして、これは aop Bean です。

最後に、これはテスト コードです (メイン メソッド内)。

出力は以下のみを印刷します。

奇妙なことに、ポイントカットに使用すると:

ログには、AfterReturningExample クラスの System.out.println が表示されます。私は何が欠けていますか?