こんにちは、こんにちは、皆さん〜私はあなたの古い友人です: Xiao Zhou ღを守ってください
Java 界のフレームワークといえば、最も古く、最も輝かしいものは Spring フレームワークです。これは、最も人気があり、広く使用されている Java 開発フレームワークの 1 つとなっています。Spring フレームワークを使用するときにこれらの問題について考えたことがあるかどうかはわかりません。春とは何ですか?Spring を理解するにはどうすればよいですか? loC と DI とは何ですか?その違いは何ですか? Spring の中心となる機能は何ですか? この記事ではそれを皆さんに説明しますので、見てみましょう~
この問題はブロガーのコラムに含まれています: JavaEE_Protect Xiao Zhouღのブログ-CSDN ブログ
プログラミングの初心者に適しており、興味のある友人は他の「JavaEE Basics」を購読して閲覧できます。
さらなるハイライトにご期待ください: 小州を守る ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★*'
1. 春とは何ですか?
Spring は、アクティブで大規模なコミュニティ (例: Apache) を持つオープン ソースの Java フレームワークであり、開発者が効率的で信頼性が高く、保守が容易なエンタープライズ レベルのアプリケーションを構築するのに役立つ一連のツールとライブラリを提供します。Spring のコア モジュールには、IOC コンテナ、AOP、ORM などが含まれます。また、Spring MVC、Spring Security、Spring Data など、さまざまなシナリオのニーズを満たすことができる多くの拡張モジュールも提供します。Spring は 2002 年に Rod Johnson によって最初に作成され、現在では最も人気があり広く使用されている Java 開発フレームワークの 1 つになりました。
Spring を一言で要約すると、多くのツールとメソッドが含まれる loC コンテナーです。
フレームワークはソフトウェア アーキテクチャであり、特定のロジックや機能を実装するコードとクラス ライブラリの集合です。フレームワーク設計者のルールに従って使用する必要があるため、フレームワークの世界では「規約は構成よりも優れています」
「構成より規約」は、合意されたデフォルトの設定と動作を使用することで、構成とコーディングのプロセスを簡素化するソフトウェア開発哲学です。この概念に基づいて、フレームワークは、事前に宣言された規則に従っていくつかの面倒な構成を自動的に完了し、いくつかのデフォルト設定と命名規則を継続するため、開発者はアプリケーションをより迅速かつ簡単に構築できます。これにより、冗長なコードと作業の重複が削減され、開発者がアプリケーションの機能開発に集中できるようになります。
不適切な例を挙げると、私たちが使用するライブラリ関数と同じように、ライブラリ関数の実装に注意を払う必要はなく、重要なのは、これらのライブラリ関数の適用シナリオ、それらがどのような機能を持ち、どのように実装されるかということです。関数のパラメータと使用法は、関数と開発者との間の合意と見なすことができます~
1.1 LOCコンテナとは
「容器」:水カップなど、何かを入れることができる「器」を容器といいます。
実はコンテナという概念はJavaSE(文法)の段階から触れられており、コレクションクラスであるArrayLIst、Map、Setはすべてコンテナであり、データを受け取るためのコンテナです。
loC (In) Inversion of Control は、中国語に翻訳すると「制御の反転」を意味します。制御の反転は、プログラムの制御フローを従来の能動的な呼び出し方法から受動的な受信方法に変更する一種のプログラミング設計アイデアです。モジュール間の制御の反転を実現する デカップリングと依存関係の管理。
1.1.1 従来の開発モデル
コード、デザインのアイデアの観点から家を建てるとします。
家 (House クラス) を建てますが、家は家の構造 (BuildingFame クラス) に依存する必要があり、家の構造は建築材料 (Buildingmaterials クラス) に依存する必要があり、建築材料は基礎に依存する必要があります (最終的なプログラムの実装コードは次のとおりです。
//这是一个房子类
public class House {
//一个房子需要依赖房屋的架构
House() {
System.out.println("这是一个房子");
}
BuildingFame buildingFame = null;
public void init() {
//依赖于房屋架构
System.out.println("执行了初始化房屋架构的方法");
this.buildingFame = new BuildingFame();
buildingFame.init();
}
}
//房屋构架
class BuildingFame {
//房屋的架构依赖与建筑材料
BuildingMaterials buildingMaterials = null;
public void init() {
//依赖于建筑材料
System.out.println("执行了初始化建筑材料的方法");
this.buildingMaterials = new BuildingMaterials();
buildingMaterials.init();
}
}
//建筑材料
class BuildingMaterials {
//建筑材料依赖于地基
Foundation foundation = null;
public void init() {
//依赖于地基
System.out.println("执行了初始化地基的方法");
this.foundation = new Foundation();
foundation.init();
}
}
//地基
class Foundation {
public void init() {
String size = "100m*m";
//依赖于地基
System.out.println("地基:" + size);
}
}
実行結果:
従来の開発の欠点:
上記の手順では、家の基礎のサイズ(正方形)が固定されていますが、住宅の需要が増加するにつれて、個人のニーズも増加します。大家族の場合は200平方メートルの家が必要になる可能性があります 、新婚夫婦の場合は、住宅が必要になる場合があります100平方メートル程度で十分かもしれませんが、この時点で家の基礎のサイズに対応しており、上記のプログラムも修正する必要があります。修正したコードは次のとおりです。
//这是一个房子类
public class House {
//一个房子需要依赖房屋的架构
House() {
System.out.println("这是一个房子");
}
BuildingFame buildingFame = null;
public void init(String size) {
//依赖于房屋架构
System.out.println("执行了初始化房屋架构的方法");
this.buildingFame = new BuildingFame();
buildingFame.init(size);
}
}
//房屋构架
class BuildingFame {
//房屋的架构依赖与建筑材料
BuildingMaterials buildingMaterials = null;
public void init(String size) {
//依赖于建筑材料
System.out.println("执行了初始化建筑材料的方法");
this.buildingMaterials = new BuildingMaterials();
buildingMaterials.init(size);
}
}
//建筑材料
class BuildingMaterials {
//建筑材料依赖于地基
Foundation foundation = null;
public void init(String size) {
//依赖于地基
System.out.println("执行了初始化地基的方法");
this.foundation = new Foundation();
foundation.init(size);
}
}
//地基
class Foundation {
String size = "100 m*m";
public void init(String size) {
this.size = size;
//依赖于地基
System.out.println("地基:" + size);
}
}
アピール コードからわかる問題は、最下位コードを変更する必要がある場合、ハウス クラス呼び出しチェーン全体のすべての依存クラスを変更する必要があり、クラス間の依存関係が非常に高いことです。
上記のプログラム設計には特定の欠陥があります。どうすれば解決できますか?
1.1.2 制御プログラム開発のloC反転
各クラスの下位クラスを作成しないようにすることもできますが、下位クラスが変更されたときに作成したクラスが変更されるように見える場合は、それに応じて変更する必要があります。このとき、現在のクラスに下位クラスを作成する必要がないため、最初に作成した下位クラスをパラメータの受け渡し方法(つまりインジェクションの方法)に変更するだけで済みます。現在のクラスは必要なものを記述しているだけなので、下位クラスが変更(パラメータの作成や削減)したとしても、現在のクラス自体はコードを変更する必要がなく、プログラムの分離が完了します。
そう言えば、「デカップリング」とは何かについて触れなければなりません。
高凝集性と低結合性 (高凝集性と低結合性)は、ソフトウェアの保守性と柔軟性を効果的に向上させるソフトウェア設計のアイデアです。
高い凝集性:モジュール内の要素が相互に密接に関連しており、他の外部要素とあまり相互作用することなく、特定かつ明確なタスクを完了できるという事実を指します。
低結合:モジュール間の相互依存性が可能な限り低く、相互影響を軽減し、ソフトウェアの柔軟性とスケーラビリティを向上させるために、モジュールはいくつかの純粋なタスクを完了する場合にのみ対話することを意味します。
高凝集性と低結合性の原理を使用すると、ソフトウェア システムの柔軟性が高まり、保守が容易になります。凝集性が高いと、モジュール内のロジックがより明確になり、各モジュールに特定の責任があるため、理解しやすく維持しやすくなります。結合性が低いと、モジュール間の相互依存性が軽減され、変更やリファクタリングが必要な場合に他のモジュールの必要性が減ります。モジュールの影響により、ソフトウェアの保守性と拡張性が向上します。
上記の考えをもとに、家を建てるプログラム例を修正し、サブクラスの作成方法をインジェクションして渡す(パラメータを渡す)方法に変更した具体的な実装コードは以下の通りです。
//这是一个房子类
public class House {
BuildingFame buildingFame = null;
//一个房子需要依赖房屋的架构
public House(BuildingFame buildingFame) {
this.buildingFame = buildingFame;
System.out.println("这是一个房子");
}
public void init() {
//依赖于房屋架构
System.out.println("执行了初始化房屋架构的方法");
buildingFame.init();
}
}
//房屋构架
class BuildingFame {
//房屋的架构依赖与建筑材料
BuildingMaterials buildingMaterials = null;
public BuildingFame(BuildingMaterials buildingMaterials) {
this.buildingMaterials = buildingMaterials;
}
public void init() {
//依赖于建筑材料
System.out.println("执行了初始化建筑材料的方法");
buildingMaterials.init();
}
}
//建筑材料
class BuildingMaterials {
//建筑材料依赖于地基
Foundation foundation = null;
public BuildingMaterials(Foundation foundation) {
this.foundation = foundation;
}
public void init() {
//依赖于地基
System.out.println("执行了初始化地基的方法");
foundation.init();
}
}
//地基
class Foundation {
String size = "100 m*m";
public Foundation(String size) {
this.size = size;
}
public void init() {
//依赖于地基
System.out.println("地基:" + size);
}
}
loC 制御反転のアイデアを使用した後は、依存クラスがどのように変更されても、呼び出しチェーン全体への影響は最小限に抑えられるため、コード間の分離が完了し、プログラムの柔軟性とスケーラビリティが向上します。
まとめ:
上記 2 つの例を見ると、2 つのインスタンス クラスの作成順序が逆になっていることがわかります。従来のコード House は BuildingFame を制御して作成し、BuildingFame は Buildingmaterials を作成します... loC 制御の反転を使用した後、順番に作成されます。は、下位レベルのオブジェクトを作成および制御する上位レベルのオブジェクトではなくなり、下位レベルのオブジェクトを現在のオブジェクトに挿入するため、下位レベルのクラスの変更が現在のクラスに影響を与えなくなります。これがloCの実現アイデアです。
1.2 Spring は loC コンテナです
上で述べたように、Spring は、複数のツール メソッドを含む loC コンテナーという一文に要約されます。ブロガーはまた、loC (制御の反転) の考え方が何であるかを例を通して説明しました。
引き続き「コンテナ」に焦点を当てます。これはコンテナであるため、次の 2 つの基本的な機能があります。
- オブジェクトをコンテナに保存します。
- コンテナからオブジェクトを削除します。
これは Spring フレームワークの中心機能でもあり、Spring にオブジェクトを格納する方法と Spring からオブジェクトを取得する方法を学習するプロセスです。
作成したオブジェクトをコンテナに入れる利点: ツールをツールボックスに入れるのと同じように、オブジェクトは loC コンテナに保存されます。必要なときにツールから直接取り出し、ツールの使用後にツールボックスに戻すだけです。その中で、新しいオブジェクト方式は、ツールを使用する必要があるたびに、ツールを持っていないことに気づき、その場で「購入」することしかできず、使用した後は保存しません。次回必要になったら「購入」する必要がある、これがloCコンテナと通常のプログラム開発の本質的な違いです。
Spring にオブジェクトを格納する方法と Spring からオブジェクトを取得する方法が次回の核心となりますので、お楽しみに。
1.3 DIの概念
loC 設計のアイデアに関して言えば、「DI」( Dependency Injection の略語、「Dependency Injection」 )について言及する必要があります。
「依存関係の注入」とは、実行時 (プログラムの実行中) に IoC コンテナーによってオブジェクトに特定の依存関係を動的に注入することを指します。従来のアプローチでは、プログラムが依存するオブジェクトをアクティブに検索してインスタンス化するのに対し、DI ではコンテナがオブジェクトに依存関係をアクティブに注入します。この利点は、オブジェクトが分離され、コードの再利用性と保守性が向上することです。DIによりオブジェクトのライフサイクルを一元管理し、資源の無駄を削減します。
loCとDIは、広い観点から見ると同じものを表しますが、別の観点から見ると、loCは設計思想(制御の反転)および指針であり、DIはloCの考え方を具体的に実現したもの――IoCコンテナです。が実行中 (プログラムの実行中)、オブジェクトに特定の依存関係を動的に挿入します。
Springに格納されるオブジェクトは「Beanオブジェクト」とも呼ばれます。
例:家が必要なのですが、
loC: 家を建てるには、まず基礎を作り、次に建材を購入し、それから家全体の構造を構築し、ゆっくりと装飾を行う必要があると思います。これは一種の設計思想であり、家を建てる目的です。
DI : 張さん、家を建てたいんです。基礎を掘るのを手伝ってくれる掘削機を送ってください。李さん、家を建てたいんです。砂、石、鉄筋コンクリートを持ってくるのを手伝ってください。 . 、やあ、ワンさん、こんな感じです。家を建てたいのですが、家を建てるのを手伝ってくれる労働者を手配してもらえます。基礎と建築資材はすでに設置されており、価格は交渉可能です。DI は、指導イデオロギーの具体的な実装です。
さて、[Spring] のコアとデザインのアイデア のブロガーによる 共有が完了しました。これが皆さんのお役に立てば幸いです。何か間違っている場合は批判と修正を歓迎します。
この記事を読んでくださった皆さんに感謝します。これからも楽しいイベントが続きます: 暁州を守る ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★*
あなたに会ったとき、すべての星が私の頭の上に落ちました...