CodeGym /Java Blog /ランダム /怠け者のための Spring の基礎、基本概念、コード付きの例。パート1
John Squirrels
レベル 41
San Francisco

怠け者のための Spring の基礎、基本概念、コード付きの例。パート1

ランダム グループに公開済み
怠け者のための Spring の基礎、基本概念、コード付きの例。 パート 1 - 1この記事では、私のコードを使用して Spring プロジェクトを 5 分で立ち上げて実行する方法を説明するつもりはありません。 ここでは基本的なことだけを書きます。つまり、知らなくてもプロジェクトを作成できる可能性のあることです。しかし、この記事を読んでも、何が起こっているのか、そしてさらに重要なことに、その理由はまだわかりません。

Spring フレームワークとは何ですか?

Spring Framework (または単に Spring) は、Java で Web アプリケーションを作成するための最も人気のあるフレームワークの 1 つです。フレームワークはライブラリに似ています (この用語のほうが馴染みがあるかもしれません) が、考慮すべき点があります。大まかに言えば、ライブラリを使用するときは、ライブラリに含まれるクラスのインスタンスを作成し、必要なメソッドを呼び出すだけで、必要な結果が得られます。言い換えれば、これはより命令的なアプローチです。プログラムでは、どのオブジェクトを作成する必要があるのか​​、どの特定のメソッドをいつ呼び出すのかなど、特定の瞬間を明示的に指定します。フレームワークでは、状況が少し異なります。独自のクラスをいくつか作成し、その中にロジックを記述するだけですが、フレームワーク自体がクラスのインスタンスを作成し、そのメソッドを呼び出します。通常、クラスはフレームワークからいくつかのインターフェイスを実装するか、そのクラスの一部を継承することで、すでに作成されている機能を提供します。しかし、常にそうとは限りません。たとえば、Spring はそのような密結合 (クラスがフレームワーク内のクラス/インターフェイスに直接依存する場合) を可能な限り回避しようとします。これを実現するためにアノテーションを使用します。これについては後で説明します。ただし、Spring は使用できるクラスとインターフェイスの単なるコレクションであることを理解することが重要です:) また、Spring は Web アプリケーションだけでなく、最も一般的なコンソール プログラムにも使用できることにもすぐに注意したいと思います。私たち全員にとってとても馴染み深いものです。今日はそのうちの 1 つを書きます。したがって、すでに作成されているいくつかの機能が提供されます。しかし、常にそうとは限りません。たとえば、Spring はそのような密結合 (クラスがフレームワーク内のクラス/インターフェイスに直接依存する場合) を可能な限り回避しようとします。これを実現するためにアノテーションを使用します。これについては後で説明します。ただし、Spring は使用できるクラスとインターフェイスの単なるコレクションであることを理解することが重要です:) また、Spring は Web アプリケーションだけでなく、最も一般的なコンソール プログラムにも使用できることにもすぐに注意したいと思います。私たち全員にとってとても馴染み深いものです。今日はそのうちの 1 つを書きます。したがって、すでに作成されているいくつかの機能が提供されます。しかし、常にそうとは限りません。たとえば、Spring はそのような密結合 (クラスがフレームワーク内のクラス/インターフェイスに直接依存する場合) を可能な限り回避しようとします。これを実現するためにアノテーションを使用します。これについては後で説明します。ただし、Spring は使用できるクラスとインターフェイスの単なるコレクションであることを理解することが重要です:) また、Spring は Web アプリケーションだけでなく、最も一般的なコンソール プログラムにも使用できることにもすぐに注意したいと思います。私たち全員にとってとても馴染み深いものです。今日はそのうちの 1 つを書きます。Spring は、そのような密結合 (クラスがフレームワーク内のクラス/インターフェイスに直接依存する場合) を可能な限り回避しようとします。これを実現するためにアノテーションを使用します。これについては後で説明します。ただし、Spring は使用できるクラスとインターフェイスの単なるコレクションであることを理解することが重要です:) また、Spring は Web アプリケーションだけでなく、最も一般的なコンソール プログラムにも使用できることにもすぐに注意したいと思います。私たち全員にとってとても馴染み深いものです。今日はそのうちの 1 つを書きます。Spring は、そのような密結合 (クラスがフレームワーク内のクラス/インターフェイスに直接依存する場合) を可能な限り回避しようとします。これを実現するためにアノテーションを使用します。これについては後で説明します。ただし、Spring は使用できるクラスとインターフェイスの単なるコレクションであることを理解することが重要です:) また、Spring は Web アプリケーションだけでなく、最も一般的なコンソール プログラムにも使用できることにもすぐに注意したいと思います。私たち全員にとってとても馴染み深いものです。今日はそのうちの 1 つを書きます。) また、Spring は Web アプリケーションだけでなく、私たち全員によく知られている最も一般的なコンソール プログラムにも使用できることにもすぐに注目したいと思います。今日はそのうちの 1 つを書きます。) また、Spring は Web アプリケーションだけでなく、私たち全員によく知られている最も一般的なコンソール プログラムにも使用できることにもすぐに注目したいと思います。今日はそのうちの 1 つを書きます。

構造

しかし、Spring は単なる 1 つの特定のフレームワークではありません。むしろ、それは、それぞれが独自の種類の作業を行ういくつかの小さなフレームワークを指すために使用される一般的な名前です。 怠け者のための Spring の基礎、基本概念、コード付きの例。 パート 1 ~ 2

https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
図 2.1。Spring フレームワークの概要

ご覧のとおり、Spring はモジュール式です。これにより、アプリケーションに必要なモジュールのみを接続し、明らかに使用しないモジュールは接続しないことができます。私の知る限り、Spring が当時の競合他社 (EJB) を上回り、リードすることができたのはこのアプローチでした。EJBを使用するアプリケーションは多くの依存関係を引きずり、その結果、動作が遅くなり、遅くなることが判明しました。 この画像は、Spring Framework がいくつかのモジュールで構成されていることを示しています。
  • データアクセス
  • ウェブ
  • もっと
今日は、メイン モジュールにあるいくつかの概念 (Bean、コンテキストなど) について説明します。ご想像のとおり、データ アクセス モジュールにはデータ (主にデータベース) を操作するためのツールが含まれており、Web モジュールはネットワーク上で操作するためのツールです (後で説明する Web アプリケーションの作成を含みます)。さらに、Spring をサポートする包括的なインフラストラクチャがあります。他の多くのプロジェクトは、フレームワーク自体には正式には含まれていませんが、Spring プロジェクトにシームレスに統合されています (たとえば、これについても触れたいと思っている Spring Security は、 Web サイトでのユーザーの認証)。

Java に Spring Framework があるのはなぜですか?

まあ、ファッショナブルで、洗練されていて、新鮮であるという事実に加えて、今言えることは、Spring を使用するスキルを少しでも習得するとすぐに、自分にはもう必要のないあらゆる種類の作業があることが理解できるようになるということです。やるべきこと、そして Spring がどれだけの仕事を引き受けるか。数十行の構成設定を記述し、いくつかのクラスを記述するだけで、動作するプロジェクトが完成します。しかし、内部でどれくらいの量のものが行われているのか、どれだけの作業が行われているのか、プレーンなサーブレットやソケット、および純粋な Java に基づいて同じプロジェクトを実装する場合、どれだけのコードを記述する必要があるのか​​を考え始めるとすぐに、髪の毛が逆立ってしまいますよ :) 春は一種の魔法だとさえ言われます。すべてが機能していることを確認すると、これを経験します。しかし、舞台裏でどのように、どれだけの作業が行われているかについても大まかに把握できるので、実際に何らかの魔法が働いているようです :) すべてがどのように相互に関連しているかを説明するよりも、魔法と呼ぶほうが簡単です。:) Spring の研究を支持する 2 番目の議論は、ジュニア開発者向けの求人の約 90% (私の個人的な観察に基づく) では、Spring が何であるかについての知識、または少なくとも一般的なアイデアが必要であるということです。Data、、、Web MVCおよびSecurityモジュールは、洗練された開発者に提供します :) しかし、今日は基本に関するものです。

DI/IoC

Spring について読もうとしたことがあるなら、最初に目にしたのはおそらく DI/IoC という頭字語でしょう。ここで、この記事を休んで、この DZone の記事を読むことを強くお勧めします。 IoC は制御の反転の略です。これについては、ライブラリを使用すると、どのオブジェクトに対してどのメソッドを呼び出すかをコード内で指定する必要があると書いたときにすでに触れましたが、フレームワークを使用すると、通常、フレームワークが適切なタイミングでコードを呼び出すことになります。言い換えれば、後者の場合、コード/プログラムの実行プロセスを管理する必要はなくなり、フレームワークがこれを実行します。制御をフレームワークに渡しました (制御の反転)。 DIは依存性注入の略です。依存関係の注入では、メイン メソッドで cat オブジェクトを作成し、それをメソッドに渡す必要はありません。代わりに、Spring Framework がそれらを作成します。「ここで猫を飼いたい」などと言うだけで、フレームワークがメソッド内で猫を渡します。この略語については今後の記事で説明します。

Bean とコンテキスト

Spring の重要な概念の 1 つは Bean です。実際、これはあるクラスのオブジェクトにすぎません。猫、犬、オウムの 3 つのオブジェクトを必要とするプログラムがあるとします。そして、たくさんのメソッドを備えたたくさんのクラスがあります。メソッドに猫が必要な場合もあれば、別のメソッドに犬が必要な場合もあり、メソッドに猫とオウムの両方が必要な場合もあります (たとえば、猫に餌を与えるメソッド、ハハ)。さらに他のメソッドでは、3 つのオブジェクトすべてが必要です。はい、まずメイン メソッドでこれら 3 つのオブジェクトを作成し、次にそれらをクラスに渡し、次にこれらのクラス内で関連するメソッドに渡します...プログラム全体でこれを繰り返すことができます。しかし、メソッドの入力パラメータのリストを時々変更したいと仮定すると (たとえば、何かを書き直すか、新しい機能を追加することに決めた場合、コードにかなりの変更を加える必要があります。そして、そのようなオブジェクトが 3 つではなく 300 個あると想像してください。1 つの代替案は、すべてのオブジェクトを 1 つのリストに集めることです (List<Object>)、それをすべてのメソッドに渡し、メソッド内で必要なオブジェクトを取得します。しかし、プログラムの実行中に、このリストにオブジェクトが追加されたり、さらに悪いことに、オブジェクトが削除されたりしたらどうなるでしょうか? これにより、インデックスを使用してリストからオブジェクトを取得するすべてのメソッドが破損する可能性があります。この問題を回避するために、オブジェクトをリストではなくマップに保存することにしました。ここで、キーはオブジェクトの名前、値はオブジェクト自体です。これにより、たとえば get("parrot") のように名前を使用するだけで必要なオブジェクトを取得でき、それに応じて parrot オブジェクトを取得します。あるいは、キーがオブジェクトのクラスであり、値がオブジェクト自体である可能性もあります。この場合、オブジェクトの名前を指定するのではなく、必要なオブジェクトのクラスを指定するだけで済みます。それも便利ですね。あるいは、マップに対してある種のラッパーを作成することもできます。その場合、一部のメソッドは名前でオブジェクトを取得し、他のメソッドはクラスでオブジェクトを取得します。私たちがここでたどり着いたものは、Spring Framework のアプリケーション コンテキスト。コンテキストは Bean (オブジェクト) のコレクションです。コンテキストにアクセスして、名前、タイプ、またはその他の方法で必要な Bean (オブジェクト) を取得します。さらに、Spring 自体に、必要な Bean を独自のコンテキストで探してメソッドに渡すように依頼することもできます。たとえば、次のようなメソッドがあったとします。

public void doSomething(Cat cat) {
    ...
}
Spring がこのメソッドを呼び出すと、そのコンテキストから cat オブジェクトが取得され、それがメソッドに渡されました。しかし今、私たちの方法には猫に加えてオウムも必要であると判断しました。Spring では、これほど簡単なことはありません。シンプルに次のように書きます。

public void doSomething(Cat cat, Parrot parrot) {
    ...
}
Spring がメソッドを呼び出すと、Spring は猫とオウムを渡す必要があることを理解しているため、コンテキストに移動してこれら 2 つのオブジェクトを取得し、メソッドに渡します。制御の手綱を Spring に移すことで、オブジェクトを作成し、それらを Spring が呼び出すメソッドに渡す責任も移譲されます。ここで疑問が生じます: Spring はどのオブジェクト (Bean) を作成するかをどのようにして知るのでしょうか?

アプリケーションを構成する方法

アプリケーションを設定するには主に 3 つの方法があります。つまり、必要なオブジェクトを Spring に正確に伝える方法です。
  1. XML設定ファイル
  2. Javaベースの構成
  3. 自動構成
Spring の作成者は次の順序で優先順位を付けています。
  • 最優先で推奨される方法は自動構成です。
  • 自動構成を使用してすべての可能な Bean を正しく構成できない場合は、Java ベースの構成を使用します (これには Java コードを使用したオブジェクトの作成が含まれます)。
  • 最も優先度の低い方法は、XML 構成ファイルを使用する昔ながらの方法です。
Spring では、これらのメソッドを組み合わせることもできます。たとえば、自動的に構成できるものはすべて Spring で構成し、特別なパラメーターが必要な場合は常に Java ベースの構成を使用し、レガシー構成には XML を使用します。これはすべて非常に柔軟に機能します。ただし、すべてを自動的に構成できる場合は、そのオプションを選択してください。ここでは、自動構成と Java ベースの構成のみを考慮します。XML 構成は、インターネット上の Spring のほぼすべての例で使用されています。さらに、Java ベースの構成がどのように機能するかを理解すれば、同じことを行う XML ファイルを問題なく読み取ることができるはずです。自動構成は、作成したクラスのオブジェクトを操作する必要がある場合に使用されます。オブジェクトの作成に非常に特殊なロジックが必要な場合は、あるいは、自動構成に必要なアノテーションを備えたクラスを作成できない場合は、Java ベースの構成を使用して、必要なことを実行できます。の中に次のパートでは、Maven プロジェクトを作成し、いくつかのメイン Spring モジュールを接続し、最初の Bean を作成します。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION