0

クライアント POJO インスタンスの状態をパフォーマンスの高い方法で追跡するソリューションを探しています。私たちが期待しているのは、POJO で変更が行われるたびに、セッターを使用してこの状態が作成されることです。OGNL ベースのウォッチング / イベント バスを作成しました。変更が行われると、適切なOgnlChangeEventイベント バスに送信されます。

これまで、AspectJ / cglib / オブジェクト グラフの Diff ソリューションを調べてきましたが、どれも CPU 時間を占有しすぎていました。現在のソリューションは Spring に基づいており、Getter メソッドが呼び出されるたびMethodInterceptorに新しいインスタンスを作成しています。Proxy

この時点で、コード生成ソリューションを検討し始めており、Byte Buddy に出会いました。この方向はそうする正しい方法ですか?Classクライアントの POJO State を拡張し、setter メソッドが呼び出されるまでその OGNL プレフィックスについて通知するnew を生成できますか?

4

2 に答える 2

2

Byte Buddy はコード生成ツールであり、もちろんそのようなソリューションを実装することは可能です。セッターをインターセプトするクラスを作成するには、次のようなコードを記述します。

new ByteBuddy()
  .subclass(UserPojo.class)
  .method(ElementMatchers.isSetter())
  .intercept(MethodDelegation.to(MyInterceptor.class)
             .andThen(SuperMethodCall.INSTANCE)
  .make();

次のようなインターセプターを記述します。

public class MyInterceptor {
  public static void intercept(Object value) {
    // business logic comes here
  }
}

このようにして、元のコードの前にトリガーされるセッターが呼び出されるたびに、いくつかのコードを追加できます。また、すべてのプリミティブ型でインターセプト メソッドをオーバーロードして、引数のボックス化を回避することもできます。Byte Buddy は、あなたのために何をすべきかを考え出します。

ただし、 performant の意味がわかりません。上記のコードは、次のようなクラスを作成するのと同じであることがわかりました。

class UserClass {
  String value;
  void setValue(String value) {
    this.value = value;
  }
}

class InstrumentedUserClass extends UserClass {
  @Override
  void setValue(String value) {
    MyInterceptor.intercept(value);
    super.setValue(value);
  }
}

パフォーマンスは、主にinterceptメソッド内で行うことのパフォーマンスに影響されます。

最後に、cglib がどのように機能しないのかわかりませんが、cglib の上に構築された Spring を使用すると機能します。調査すべき傍受ロジックに問題があると思われます。

于 2016-03-20T10:02:20.413 に答える