依存関係噴射導入
まず、依存関係の注入の概念を確認しましょう。
依存関係の注入と制御の反転。これは、同じ概念であることがよくあることです。具体的な意味は、役割(Javaインスタンス、発信者)が別の役割(別のJavaインスタンス、発信者)の支援を必要とする場合、従来のプログラミングプロセスでは、発信者は通常発信者によって作成されます。しかし、春には、Calleeの作成作業は発信者によって行われなくなったため、コントロール反転と呼ばれます。 Calleeインスタンスの作成作業は通常、スプリングコンテナによって行われ、発信者に注入されるため、依存関係噴射とも呼ばれます。
実際、簡単に言えば、依存関係注射の役割は、元のコードからオブジェクト間の依存関係を分離し、柔軟性と中央に依存関係を管理できるようにスプリングフレームワーク処理を追加することです。
依存関係噴射フレームワーク
依存関係の噴射フレームワークは神秘的ではなく、実際には非常に単純なものです。スプリングの依存関係インジェクションソースコードを見ないでください。なぜなら、あなたが行く限り、それはあなたが二度と書くことはなく、あなたが自分で始めようとしないことを意味するからです。その機能は強すぎるため、デザインは複雑すぎます。普通のプログラマーは、その目に見えるだけでため息をつくことができます。
スプリングソースコードを注意深く読みませんでした。それでも、基本的に標準の依存噴射標準「JSR-330」を満たしている小さなフレームワークiockidsを適用するのに半日しかかかりませんでした。この小さなフレームワークには、約200行のコードを備えたメインクラスインジェクターが1つしかなく、次の機能があります。
使用法のやや複雑な例を見てみましょう
javax.inject.inject;インポートjavax.inject.named;インポートjavax.inject.singleton; import iockids.injector; @singletonclass root {@inject @named( "a")node a; @inject @named( "b")ノードB; @Override public String toString(){return string.format( "root(%s、%s)"、a.name()、b.name()); }} interface node {string name();}@singleton@named( "a")class nodeaはnode {@inject leaf leaf; @inject @named( "b")ノードB; @Override public string name(){if(b == null)return string.format( "nodea(s)"、leaf); else return string.format( "nodeawithb(%s)"、leaf); }}@singleton@named( "b")class nodebを実装します{leaf leaf; @inject @named( "a")ノードa; @inject public nodeb(葉の葉){this.leaf = leaf; } @Override public string name(){if(a == null)return string.format( "nodeb(%s)"、leaf); else return string.format( "nodebwitha(%s)"、leaf); }} class Leaf {@inject root; intインデックス;静的INTシーケンス; public Leaf(){index = sequence ++; } public String toString(){if(root == null)return "Leaf" + index;それ以外の場合は、「LeafwithRoot」 +インデックスを返します。 }} public class demo {public static void main(string [] args){var injector = new injector(); Injector.registerqualifiedClass(node.class、nodea.class); Injector.registerqualifiedClass(node.class、nodeb.class); var root = injector.getInstance(root.class); System.out.println(root); }}上記のコードでは、Iockidsが提供するすべての機能を使用しています。
上記のコードの理解を促進するために、依存図を描きました
上記のコード出力は次のとおりです
root(nodeawithb(leafwithroot0)、nodebwitha(leafwithroot1))
この出力から、依存関係構造を大まかに想像することもできます。
IOCKIDSは、ユーザーインジェクションの構成エラーを防ぐために、豊富なインジェクションエラー例外レポートを提供します。
たとえば、上記のnodeaとnodebの名前を同じaに構成すると、以下のエラースタックが公開されます。
iockids.InjectException:複製資格のあるjavax.inject.demo.demo.node at iockids.injector.registerqualiedclass(injector.java:87)at iockids.injector.registerqualifiedclass(injector.java:70)at iockids.injisterqualifiedclass(injector.java:87) iockids.demo.demo.main(demo.java:106)
nodebのコンストラクターに自由にパラメーターを追加すると
@Inject public nodeb(leaf leaf、int k){this.leaf = leaf; }実行時に次のエラーがスローされます
iockids.injectexception:Iockids.injector.createNew(injector.java:120)のIockids.injector.createNew(injector.java:94)at iockids.injeds.injedsor.createfromparameter(infertor.java:167)at iockids.createNew(injector.java:94)at iockids.createNew(injector.java:120)のアクセス可能なコンストラクターなしiockids.injector.createfromconstructor(injector.java:145)at iockids.injector.createNew(injector.java:123)at iockids.injedsor.createfromqualified(injector.java:216)at iockids.createfromfield(injector.createfromfield) iockids.injector.injectmembers(injector.java:233)at iockids.injector.createNew(injector.java:136)at iockids.injector.injedsor.createfromqualified(injector.java:216)at iockids.injector.createfromfield at iockids.injector.injectmembers(injector.java:233)at iockids.injector.createNew(injector.java:136)at iockids.injector.createNew(injector.java:94)at iockids.injector.getinstance(Injector.java:245) iockids.demo.demo.main(demo.java:107)
プロジェクトオープンソースアドレス:https://github.com/pyloque/iockids(ローカルダウンロード)
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。