問題タブ [pointcut]
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 - ジョインポイント call(* *.*(..)) を使用して、可能であれば引数をアドバイスに公開できますか?
私のアスペクトではjava.util.Set
、 、特にadd(Object)
とのインスタンスで特定のメソッド呼び出しをアドバイスすることにより、特定のコレクションの変更を追跡しますremove(Object)
。変更はコレクション自体には反映されないため、 を呼び出しSet.contains(Object)
たり、Set.size()
間違った結果を返したりします。
add
したがって、Set のインスタンス (とを除く) へのすべてのメソッド呼び出しをインターセプトしremove
、その呼び出しを最新のコレクションに転送したいと考えています。
もちろん、異なるポイントカットを使用して、次のような 2 つのアドバイスを定義することもできます。
それは機能しますが、かなり醜いです。私のアドバイスの本文は非常に類似しています。だから私はそれらを「結合」したいと思います。次のように、両方のポイントカットに織り込まれた単一のアドバイスを効果的に持つことができます。
これはまったく可能ですか?ポイントカットの1つでは引数を公開し(その後アドバイスで使用します)、もう1つのポイントカットには引数がないため、同封のアドバイスで「潜在的な識別子」をバインドすることは不可能に思われるため、そうではないと感じています...しかし、私は何かを見落としていて、正しい方向に私を向けることができるかもしれないことを願っています. ありがとう!
java - インターフェイスのアノテーションに一致するSpringAOPポイントカット
Java 6 / Spring 3に実装されたサービスクラスがあり、ロールごとにアクセスを制限するためのアノテーションが必要です。
値属性としてOperationTypeという列挙型からの1つ以上の値を持つRequiredPermissionというアノテーションを定義しました。
また、次のアスペクト定義があります。
パラメータオブジェクトにはユーザー名が含まれており、メソッドへのアクセスを許可する前に、ユーザーに必要な役割を検索したいと思います。
MyServiceImplのメソッドにアノテーションを付けると、すべてが正常に機能し、ポイントカットが一致し、アスペクトが開始されます。ただし、アノテーションはサービスコントラクトの一部であり、インターフェイスとともに別のAPIパッケージで公開する必要があると思います。 。そして明らかに、サービス定義と実装(DRY)の両方に注釈を付けたくありません。
Spring AOPには、1つのインターフェースメソッド(トランザクションなど)のアノテーションによってアスペクトがトリガーされる場合があることを私は知っています。ここに特別な構文がありますか、それともそのままでは不可能です。
PS:うまく機能しているように見えるので、春の設定を投稿していません。いいえ、それらは私の元のクラス名でもメソッド名でもありません。
PPS:実際、これが私の春の設定の関連部分です:
java - ポイントカットを定義して、インターフェイスをキャプチャしますが、親インターフェイスまたはサブ インターフェイスはキャプチャしません
親またはサブインターフェイスのメソッドではなく、インターフェイスのメソッドをキャプチャするaspecJでポイントカットを定義する方法を考えていました。
methodB() のみをキャッチし、methodA() または methodC() をキャッチしないポインカットが必要です。ポイントカットにすべてのサブおよびスーパーインターフェイスをリストせずに、一般的な方法でこれを行う方法はありますか?
java - 単純なタイプのAspectJジョインポイント
算術演算でキャッチできる定義済みのジョインポイントはありますか?
何かのようなもの:
pointcut
それらの線のいずれかをキャッチするを作成できますか?そして、どのようなコンテキストを取得できますか?
クラスの特定のメソッドで行われるすべてのint/float / double操作にを追加したいのbefore()
ですが、それは可能です。
AspectJのドキュメントで、オブジェクトの初期化とメソッド呼び出しのために定義されたジョインポイントがあることがわかります。int
オブジェクトの初期化を宣言していて、+
演算子はメソッド呼び出しとしてカウントされますか?
ありがとう!
java - 私はaspectjrt.jarも追加しましたが、Spring Aopポイントカットを使用するとエラーが発生します
この問題を解決できません エラー :
java.lang.IllegalStateException: ContainerBase.addChild: 開始: org.apache.catalina.LifecycleException: javax.xml.parsers.FactoryConfigurationError: プロバイダー org.apache.xerces.jaxp.SAXParserFactoryImpl が org.apache.catalina.core.ContainerBase に見つかりません.addChildInternal(ContainerBase.java:932) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:912) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:694) at com. com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1605) の com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1933) com.sun.enterprise.web.WebApplication.start(WebApplication. java:90) org.glassfish.internal.data.EngineRef.start(EngineRef.java:126) で org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:241) at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:236) at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:339) com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:183) で org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:272) で com.sun.enterprise.v3.admin で.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:305) at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:320) at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl. java:1176) (com.sun.enterprise.v3.admin.CommandRunnerImpl.access$900)(CommandRunnerImpl.java:83) (com.sun.enterprise.v3.admin)。CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235) com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1224) com.sun.enterprise.v3.admin.AdminAdapter.doCommand( AdminAdapter.java:365) com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:204) com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:166) com .sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:100) com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:245) com.sun.grizzly.http com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) の com.sun.grizzly.http.ProcessorTask の .ProcessorTask.invokeAdapter(ProcessorTask.java:791)。process(ProcessorTask.java:954) com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) com.sun.grizzly .DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com. sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) com.sun.grizzly.ContextTask.run(ContextTask.java:69) com で.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) com.java.lang.Thread.run(Thread.java:619) での sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
aop - スキャンするクラスが多すぎて、メソッドキャッシュがメモリをいっぱいにする側面
私たちのアプリケーションには、いくつか(実際には多く、約30)のWebサービスがあります。各Webサービスは独自のWARファイルに常駐し、アプリケーションの起動時に初期化される独自のSpringコンテキストを持っています。
また、Webサービスクラスに適用するアノテーション駆動型のアスペクトクラスもいくつかあります。最初のpoincut式は次のようになりました。
また、AOPは、構成への入力を通じてサービスで有効になりました。
しかし、Webサービスの数が増えるとOutOfMemoryException
、サーバーでsを経験し始めました。いくつかのプロファイリングと分析を行った後、AspectJExpressionPointcutクラスのインスタンスによって保持されているキャッシュによってメモリが使用されているように見えました。
各インスタンスのキャッシュは約5MBでした。また、3つの側面と30のサービスがあるため、合計で450MBのデータを保持する90のインスタンスが生成されました。
キャッシュの内容を調べたところ、my.package.service.businessパッケージの一部ではないクラスも含め、WARに存在するすべてのクラスのJavaリフレクションメソッドインスタンスが含まれていることがわかりました。ポイントカット式を変更して、追加のwithin
句を追加した後:
メモリ使用量は再び通常に低下しました。そして、すべてのAspectJExpressionPointcutインスタンスは、全体で1MB未満しかかかりませんでした。
誰かがそれがなぜであるか説明できますか?そして、なぜ最初のポイントカット式では不十分なのですか?のキャッシュがAspectJExpressionPointcut
共有されないのはなぜですか?
java - メソッド変数の AspectJ ポイントカットは可能ですか?
私はしばらく AspectJ を使用してきましたが、注釈を含むオブジェクト スコープ フィールドでうまく機能します。ポイントカットで機能するメソッドスコープの変数に注釈を付けたいという状況に遭遇しましたが、問題が発生しています。
これが私が使用しているポイントカットです。変数がオブジェクトのフィールドである場合は正常に機能しますが、スコープをメソッド (メソッド内で宣言された変数) に縮小すると、機能しなくなり、理由がわかりません。私にできることを教えてください、ありがとう。
また、ここに私がやりたいことの例があります。上記の System.out.println は、トリガーがインスタンス化されたときに起動する必要があります。
java - SpringAOPはHessianServiceのいくつかのメソッドを無視します
次のポイントカット定義のアスペクトがあります
および以下を含むばね構成
(実際の構成には複数のサービスがあります)
一部のメソッドでアスペクトが呼び出されるのがわかりますが、すべてではありません。インターフェイスで直接宣言されたメソッドのみがアスペクトにラップされ、スーパーインターフェイスで宣言されたメソッドは無視されるのではないかと疑っています(ただし、そのインターフェイスは同じポイントカットに一致する必要があります)。
これは予想される動作ですか?どうすれば変更できますか?他に何が起こっているのでしょうか?
spring - SpringAOPポイントカットの説明が必要です
ポイントカットパターンには2つのバリエーションがあります。
これ
この
最後の2つの*の間のドット(またはドットがないこと)の意味は何ですか?
exception - AspectJ から戻り値または例外を取得しますか?
推奨されたメソッド呼び出しから署名と引数を取得できますが、戻り値または例外を取得する方法がわかりません。何らかの方法で around を使用して実行できると想定しています。