Springbootエージェント工場
4993 ワード
エージェントファクトリ(Springでサポートされているエージェント)
動的エージェントの問題
代理工場
Springは、動的エージェントを統合することで容易に作成できるエージェントファクトリと呼ばれる機能を提供します.
エージェントファクトリにインタフェースがある場合はJDKダイナミックエージェントを使用し,具体的なクラスのみCGIBをサポートする.
クライアントがエージェントファクトリを要求すると、エージェントファクトリは状況に応じてjdkダイナミックエージェントまたはCGIB特定のクラスエージェントに戻ります.
Springは付加機能を適用する際に「advice」という新しい概念を導入してこの問題を解決した.
開発者は「Advice」を作成するだけで、InvocationHandlerやMethodInterceptorに関心を持つ必要はありません.
ServiceInterface target = new ServiceImpl();
//여기서 프록시를 만들때 타캣을 넣어준다.
ProxyFactory proxyFactory = new ProxyFactory(target);
proxyFactory.addAdvice(new TimeAdvice());
ServiceInterface proxy = (ServiceInterface) proxyFactory.getProxy();
proxy.save();
//프록시팩토리를 사용할 때만 사용가능
assertThat(AopUtils.isAopProxy(proxy)).isTrue();
assertThat(AopUtils.isJdkDynamicProxy(proxy)).isTrue();
assertThat(AopUtils.isCglibProxy(proxy)).isFalse();
proxyFactory.getProxy():エージェントオブジェクトを作成し、結果を受信します.これにより、クラス情報をインスタンスに直接出力して検証することもできます.getClass();
エージェントファクトリのテクノロジーの選択方法
整理する
エージェントファクトリのサービス抽象化により、特定のエージェント技術に依存することなく、動的エージェントを容易に作成できます.
これは内部にハンドルがあるからです.
リファレンス
AOPを適用すると、スプリングガイドのデフォルト設定は「ProxyTargetClass=true」です.
したがって,インタフェースがあっても,CGIBを用いて特定のクラスからエージェントを生成することが多い.
アクセントレンズ
すなわち,ある点に名前で機能を適用しなければ区別する.
デバイスとしてどの論理を適用するかを選択します.
どこにいても、どんな論理でも、知っているのは助け者です.
役割と責任
このように分ける理由は、役割と責任を明確に区別しているからです.
使用例
ServiceInterface target = new ServiceImpl();
ProxyFactory proxyFactory = new ProxyFactory(target);
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(Pointcut.TRUE, new TimeAdvice());
proxyFactory.addAdvisor(advisor);
ServiceInterface proxy = (ServiceInterface) proxyFactory.getProxy();
proxy.save();
proxy.find();
通話員は内部に重点レンズと通話員がある.そのため、どのような付加機能をどこで適用すべきかは、1つのヒントしかありません.
エージェントファクトリを使用する場合は、コンサルタントが必要です.
スプリングによるポイントカット
スプリングは無数の点切り欠きを提供します.
代表的なポイント
最も重要なのはaspectJ式です
ここでは、
AspectJExpressionPointcutが使用されます.
複数のコンサルタントを同時に適用
通話員には重点レンズと通話員がいます.複数のコンサルタントを1つのtargetに適用するには、次の手順に従います.
複数のエージェントを作成する方法はありますが、よくありません.
@Test
@DisplayName("하나의 프록시 여러 어드바이저")
void multiAdvisorTest2(){
//client -> proxy->advisor1 -> advisor2 -> target
//여러 어드바이저 적용
//이때 각 어드바이저의 포인트컷이 적용된상태로 실행된다.
DefaultPointcutAdvisor advisor1 = new DefaultPointcutAdvisor(Pointcut.TRUE, new Advice1());
DefaultPointcutAdvisor advisor2 = new DefaultPointcutAdvisor(Pointcut.TRUE, new Advice2());
//프록시 1 생성
ServiceInterface target = new ServiceImpl();
ProxyFactory proxyFactory1 = new ProxyFactory(target);
//순서대로 동작
proxyFactory1.addAdvisor(advisor2);
proxyFactory1.addAdvisor(advisor1);
ServiceInterface proxy1 = (ServiceInterface) proxyFactory1.getProxy();
//실행
proxy1.save();
重要
Spring AOPを初めて学習または適用すると,生成されたエージェントの数がアプリケーションAOPの数と同じであると勘違いする.
スプリングはAOPを適用する際に最適化され,現在のように1つのエージェントのみが作成され,1つのエージェントに複数のウィザードが適用される.
複数のAPを1つのターゲットに同時に適用すると、スプリングはターゲットごとにプロキシを作成します.
つまり、その中に様々なコンサルタントが加わる.
質問する
たとえば、アプリケーションにスプリングが100個ある場合は、エージェントを介して100個以上の追加機能を提供するには、100個の動的エージェントを作成する必要があります.
素子スキャンを行うと、以上の方法は不可能である.エージェントはスプリングシートに登録されているため、スキャンされたコンポーネントの実際のオブジェクトを登録するときに使用できません.
この問題を解決するには、空のポストプロセッサを知る必要があります。
Reference
この問題について(Springbootエージェント工場), 我々は、より多くの情報をここで見つけました https://velog.io/@fj2008/Springboot프록시-팩토리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol