JavaRush /Java Blog /Random-JA /春は怠け者のためのものです。基礎、基本概念、コード付きの例。パート1
Стас Пасинков
レベル 26
Киев

春は怠け者のためのものです。基礎、基本概念、コード付きの例。パート1

Random-JA グループに公開済み
Web プロジェクトのテンプレートの作成と、サーブレットを使用した単純な Web サービスの作成 に関する私の記事を読んだ多くの人が、Spring についていつ書くのかと疑問に思いました。私はそんなことはしたくなかったので、本を読むことを提案しました(そして今でも、本はインターネット上の 10 記事、さらには 100 記事よりも優れていると言っています)。しかし今では、同じことをさまざまな人に説明する方が、一度座って記事を書いて、そのリンクを投稿するよりも多くの時間を費やすことにしました。したがって、リンクのために書いています))。 春は怠け者のためのものです。 基礎、基本概念、コード付きの例。 パート 1 - 1この記事では、私の例に従って Spring で動作するプロジェクトを 5 分で作成する方法は書きません。 基本的なことだけを書きますが、知識がなくてもプロジェクトを開始することは確かに可能ですが、そこで何が起こっているのか、そしてより重要なことに、なぜそうなのかは明らかではありません。

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

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

構造

しかし、Spring は 1 つの特定のフレームワークではありません。これはむしろ、いくつかの小さなフレームワークの一般的な名前であり、それぞれが何らかの異なるジョブを実行します。
春は怠け者のためのものです。 基礎、基本概念、コード付きの例。 パート 1 ~ 2
ご覧のとおり、スプリングはモジュール構造になっています。これにより、アプリケーションに必要なモジュールのみを接続し、明らかに使用しないモジュールは接続しないことができます。私の知る限り、Spring が当時の競合他社 (EJB) を上回り、リードするのに貢献したのはこのアプローチでした。EJBを使用するアプリケーションは多くの依存関係を取得し、一般的に遅くて扱いにくいことが判明したためです。 この画像は、Spring フレームワークがいくつかのモジュールで構成されていることを示しています。
  • データアクセス;
  • ウェブ;
  • 芯;
  • その他。
今日は、Bean、コンテキストなど、メイン モジュールのいくつかの概念について説明します。ご想像のとおり、データ アクセスモジュールには、データ (主にデータベース) を操作するためのツール、Web - ネットワーク上で操作するためのツール (後で説明する Web アプリケーションの作成を含む) が含まれています。さらに、いわゆる Spring インフラストラクチャ全体もあります。フレームワーク自体には正式には含まれていませんが、Spring プロジェクトにシームレスに統合されている他の多くのプロジェクト (たとえばいつか私たちもそれを感じることを願っています)。

なぜ Java に Spring があるのでしょうか?

まあ、それがファッショナブルでスタイリッシュで若々しいという事実に加えて、私はすぐにそれを少しでもマスターすれば、今あなたがする必要がないどれほど異なる作業があり、どれほど春であるかを理解するでしょう。引き受けます。数十行の構成を記述し、いくつかのクラスを記述するだけで、動作するプロジェクトが得られます。しかし、「内部」でどれだけのものが存在するのか、どれだけの作業が行われているのか、同じプロジェクトを裸のサーブレットまたはソケットと純粋な Java で実行した場合にどれだけのコードを記述する必要があるのか​​を考え始めるとすぐに、 - あなたの髪は逆立ちます:) 春の「魔法」のような、そのような表現さえあります。これは、すべてが機能していることがわかりますが、すべてが機能するためにはどのくらいのことが必要か、そしてすべてがそこでどのように機能するかを大まかに見積もるときです。そうすると、これはすべてある種の魔法のおかげで起こっているように見えます。本当に))すべてがそこでどのように相互接続されているかを説明しようとするよりも、それをすべて魔法と呼びましょう。笑顔data_ web-mvc_ security_ 基本だけです。

DI/IoC

Spring で何かを読もうとした場合、最初に目にしたのはおそらくDI/IoCという文字でしょう。この記事から少し休憩して、ハブレに関するこの記事を読むことを強くお勧めします。 IoC (Inversion of Control) - 制御の反転。これについては、ライブラリを使用する場合、どのオブジェクトのどのメソッドを呼び出すかを自分でコードに記述し、フレームワークの場合、ほとんどの場合、フレームワークは右側で記述したコードを呼び出すと書いたときにすでに触れました。一瞬。つまり、ここではコード/プログラムの実行プロセスを制御するのではなく、フレームワークがそれを実行します。あなたは彼にコントロールを移しました(コントロールの反転)。DIは、依存関係の反転(依存関係の反転、つまり、あるクラスが別のクラスに直接結び付けられる、モジュール/クラス間のハード接続を行わないことを試みる)、または依存関係の注入(依存関係の注入、これは cat オブジェクトが依存関係を持たない場合) として理解されます。あなたがメインで作成し、それをあなたのメソッドに渡すと、Spring があなたのためにそれらを作成し、あなたが彼に「ここで猫を飼いたい」などと言うだけで、彼はそれをあなたのメソッドであなたに渡します)。2 番目については今後の記事で頻繁に取り上げます。

Bean とコンテキスト

春の重要な概念の 1 つはBeanです。本質的には、それはあるクラスの単なるオブジェクトです。私たちのプログラムでは、猫、犬、オウムの 3 つのオブジェクトを使用する必要があるとします。そして、たくさんのメソッドを持つたくさんのクラスがあり、あるメソッドには猫が必要で、別のメソッドには犬が必要な場合もあれば、猫とオウムが必要なメソッドがある場合もあります (たとえば、メソッド猫に餌をあげるときです、ふふ)、方法によっては 3 つのオブジェクトすべてが必要になります。はい、まずメインでこれら 3 つのオブジェクトを作成し、次にそれらをクラスに渡し、クラス内から必要なメソッドに渡します。これをプログラム全体で繰り返します。また、メソッドで受け入れられるパラメーターのリストを定期的に変更したいと考えた場合 (つまり、何かを書き直すか、機能を追加することにしました)、必要に応じてコードをかなり多く編集する必要があります。何かを変更。さて、そのようなオブジェクトが 3 つではなく 300 個あると想像したらどうなるでしょうか? 別の方法としては、そのようなオブジェクトをすべて 1 つの共通のオブジェクト リスト ( List<Object> ) に集めてすべてのメソッドに渡し、メソッド内から必要なオブジェクトを取得することです。しかし、プログラムが進行するにつれて、何らかのオブジェクトがこのリストに追加されたり、(さらに悪いことに) 削除されたりする可能性があると想像したらどうなるでしょうか? その場合、インデックスによってリストからオブジェクトを取得するすべてのメソッドで、すべてが壊れる可能性があります。次に、リストではなくマップを保存することにします。キーは必要なオブジェクトの名前、値はオブジェクト自体になります。その後、必要なオブジェクトを名前だけでそこから取得できます。 : get("parrot")と応答としてオブジェクト parrot を受け取りました または、たとえば、キーがオブジェクトのクラスで、値がオブジェクト自体である場合、オブジェクトの名前を指定することはできなくなり、単に必要なオブジェクトのクラスを指定するだけで済みます。これも便利です。あるいは、マップ上にある種のラッパーを作成して、場合によっては名前でオブジェクトを取得したり、別の場合にはクラスでオブジェクトを取得したりできるメソッドを作成できます。これは Springアプリケーション コンテキストから取得したものです。コンテキストは Bean (オブジェクト) のセットです。コンテキストに目を向けると、必要な Bean (オブジェクト) を、たとえば名前、タイプ、またはその他によって取得できます。さらに、コンテキスト内で必要な Bean を探してメソッドに渡すように Spring に依頼できます。たとえば、次のようなメソッドがあったとします。
public void doSomething(Cat cat) {
    ...
}
Spring がこのメソッドを呼び出したとき、猫のオブジェクトがコンテキストからメソッドに渡されました。ここで、私たちのメソッドには猫に加えてオウムも必要であると判断しました。スプリングを使用する - 私たちにとって、これほど簡単なことはありません。シンプルに次のように書きます。
public void doSomething(Cat cat, Parrot parrot) {
    ...
}
Spring は、このメソッドを呼び出すと、ここで猫とオウムを渡し、そのコンテキストに移動して、これら 2 つのオブジェクトを取得してメソッドに渡す必要があることを理解します。プログラムの手綱を Spring に引き渡すことにより、オブジェクトを作成し、それを Spring が呼び出すメソッドに渡す責任も Spring に移譲しました。Spring はどのオブジェクト (ビン) を作成するかをどのようにして知るのでしょうか?という疑問が生じます。

アプリケーションの構成方法

アプリケーションを設定するには(つまり、どのオブジェクトを動作させる必要があるかを Spring に指示する)、 主に 3 つの方法があります。
  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