このセクションの重要なポイント:
Java静的プロキシ
JDKダイナミックエージェント
オブジェクト指向のデザインのアイデアで遭遇する1つの問題
従来のOOPプログラミングでは、オブジェクトはコアであり、オブジェクト間のコラボレーションを通じて完全なソフトウェア関数が形成されます。オブジェクトを継承できるため、同じ機能または同じ特性を持つ属性を抽象化する属性を明確に階層的なクラス構造システムに抽象化できます。ソフトウェア仕様の継続的な拡大により、より専門的な労働部門がますますシリーズになり、OOPアプリケーションの慣行の数が増えているため、OOPがうまく解決できない問題も明らかにしています。
ここで、システムには完全に類似した3つのコードがあり、通常は「コピー」と「貼り付け」によって完了するとします。このように開発されたソフトウェアは、図に示されています。
読者は、このアプローチの欠点を発見したかもしれません。ある日、青い背景を持つコードを変更する必要がある場合、同時に3つの場所を変更する必要がありますか?これらの3つの場所がこのコードを含むだけでなく、100か、さらには1,000の場所を含む場合、結果は何ですか?
ロギングはコードのいたるところにあります - まず例を見てください。
アプリケーションの操作を追跡するために、多くの方法でロギング情報が必要です。私たちは通常これを書きます:
// log4jインポートorg.apache.log4j.loggerの記事「log4jはじめに」を参照してください{private logger logger = ogger.class(person.class); public void sleep(){logger.info( "start execution time:" + new date()); system.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out. date());} public void eating(){logger.info( "実行時間の開始時間:" + new date()); date() "); system.out.println(" Incubation "); logger.info(" "実行終了時間:" + new date() ");}}}質問:不利な点は何ですか?
Lは、ビジネス方法自体の責任を混同します
lメンテナンスワークロードは巨大です
2ソリューション1
静的プロキシ:
1.どのクラスのコアクラス(プロキシクラス)とどの方法があるかを知る必要があります。
2。非コアコードを複数回繰り返す必要があります。これにより、コード構造が肥大化しているように見え、コード冗長性を作成します。
3。非コアクラス(プロキシクラス)コアクラス(プロキシクラス)によって実装されたインターフェイスを実装する必要があります。つまり、共通インターフェイスを実装する必要がありますが、コアクラス(プロキシクラス)によって実装されたインターフェイスは一般的です。
Lの目的は、ビジネスコードをログコードから完全に分離し、ゆるい結合を実現することです。
lプロキシオブジェクトとプロキシオブジェクトは、同じインターフェイスを実装し、プロキシオブジェクトにログするための関連サービスを実装し、必要に応じてプロキシオブジェクトを呼び出し、プロキシオブジェクトはビジネスコードのみを保持します。
静的プロキシの実装
1)インターフェイスを定義します。
パブリックインターフェイスIperson {public Abstract void Sleep(); public Abstract void eating();}2)プロキシクラス
パブリッククラスの人はiperson {public void sleep(){system.out.println( "sleeping");} public void eating(){system.out.println( "eating");}}}}3)エージェントクラス
Import org.apache.log4j.logger; public class personproxy Implention iperson {private iperson person; private logger logger = ogger.getlogger(personproxy.class); public personproxy(iperson person){this.person = person;} public void eating(){logger.info( date() "); person.eating(); logger.info(" "実行終了時間:" + new date() ");} public void sleep(){logger.info("実行時間: " + new date()"); sleep(); ogger.info( ""実行時間: " + new()");};4)テストクラス
パッケージcom.aptech.aop2; public class persontest {public static void main(string [] args){iperson proxy = new personproxy(new person()); proxy.eating(); proxy.sleep();}}}静的プロキシの短所:
プロキシインターフェイスは、1種類のオブジェクトのみを提供できます。わずかに大きなプロジェクトでは、単に無能です。
3ソリューション2ダイナミック剤
InvocationHandler:各動的プロキシクラスは、InvocationHandlerインターフェイスを実装する必要があり、プロキシクラスの各インスタンスはハンドラーに関連付けられています。プロキシオブジェクトを介してメソッドを呼び出すと、このメソッドの呼び出しは、呼び出しの呼び出しハンドラーインターフェイスの呼び出しメソッドに転送されます。
JDK1.3の後、開発を支援できる動的プロキシ関数が追加されました。特定のオブジェクトとメソッドに特定のプロキシオブジェクトを記述する必要はありません。動的プロキシを使用すると、ハンドラーが各オブジェクトを提供することができます。
プロセッサのクラス設計では、java.lang.refllect.invocationhandlerインターフェイスを実装する必要があります。
InvocationHandlerインターフェイスを介して実装された動的プロキシは、インターフェイスの実装クラスのみをプロキシできます。
動的プロキシ実装
1)ハンドラー
パブリッククラスのdynaproxyhandlerを実装したInvocationhandler {private logger logger = logger.getLogger(dynaproxyhandler.class); private objectターゲット; // proxyオブジェクトパブリックボイドセットゲット(オブジェクトターゲット){this.target =ターゲット;}パブリックオブジェクトはinvoke(オブジェクトプロキシ、メソッド、方法、オブジェクト)投げ式date()); object result = method.invoke(ターゲット、args); logger.info( "実行終了時間:" + new date()); return result; // returnメソッド実行結果}}}2)生産エージェント向けの工場
Import java.lang.reflect.proxy; public class dynaproxyfactory {// objはプロキシオブジェクトパブリックオブジェクトgetProxy(object obj){dynaproxyhandler handler = new dynaproxyhandler(); handler.settgetget(obj); proxy.newproxyinstance(obj.getclass()。getClassLoader()、obj.getClass()。getInterfaces()、ハンドラー);}}}3)テストクラス
public class persontest {public static void main(string [] args){iperson person =(iperson)dynaproxyfactory.getProxy(new Person()); //プロキシクラスを返すと、プロキシクラスはJVMによってメモリの動的に作成されます。このクラスは、着信インターフェイス配列のすべてのインターフェイス(すべての方法)を実装します。要約します
上記は、この記事のSpring Static Proxyおよび動的プロキシコードのすべての詳細な説明です。私はそれが誰にでも役立つことを願っています。興味のある友達は引き続きこのサイトを参照できます:
スプリングの一般的な構成と分析クラスの説明
SpringMVCインターセプターは、シングルサインオンを実装します
springMVCシンプルログイン例のJavaプログラミングの実装
欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!