なぜ
誕生の初めに、春を作成する主な目的は、よりヘビー級のエンタープライズレベルのJavaテクノロジー、特にEJBを置き換えることでした。 EJBと比較して、Springはより軽量でシンプルなプログラミングモデルを提供します。
何
Springは、Rodjohnsonによって最初に作成されたオープンソースフレームワークです。 Springは、エンタープライズレベルのアプリケーション開発の複雑さを解決するために作成されました。 Springを使用すると、単純なJavabeansがEJBだけが以前に達成できたものを実装できるようになります。 Springはサーバー側の開発に限定されず、Javaアプリケーションは、シンプルさ、テスト可能性、ゆるいカップリングの点でSpringの恩恵を受けることができます。
今日、春はモバイル開発、ソーシャルAPI統合、NOSQLデータベース、クラウドコンピューティング、ビッグデータに関与しています。時間が経つにつれて、EJBは依存関係注射(DI)とアスペクト指向プログラミング(AOP)の概念も採用しました。要するに、春の最も基本的な使命は、Java開発を簡素化することです
どうやって
Java開発の複雑さを減らすために、Springは4分間の重要な戦略を採用しています
POJOに基づく軽量で最小限の侵襲的プログラミングにより、依存関係の注入とインターフェイス指向によるゆるい結合が可能になります
セクションと慣習に基づく宣言的プログラミングは、セクションとテンプレートを介してスタイルコードを削減します
ポジョの可能性
多くのフレームワークは、アプリケーションにクラスを継承するか、インターフェイスを実装することを強制します。これにより、アプリケーションは侵襲的なプログラミングであるフレームワークにバインドされているため、コードブロックを再利用できなくなります。 Springは、独自のAPIのためにアプリケーションコードを台無しにしないように努めています。春に構築されたアプリケーションでは、そのクラスには通常、春を使用している兆候の痕跡はありません。
パブリッククラスHelloworldbean {public string sayshello(){return "Hello World"; }}上記の例コードは、非常にシンプルで通常のJavaクラス(POJO)を表しています。スプリングコンポーネントであるとは言えません。 Springの非侵襲的プログラミングは、Springアプリケーションと非スプリングアプリケーションの両方で役割を果たすことができるこのクラスに反映されています。このコードの一部は、実際にはSpringの機能を反映するものではなく、次の知識がまだ必要です。
依存関係注射(クラス自体を注入することに応じて)
依存関係注射は春にはそれほど高くありませんが、複雑なプログラミング手法または設計パターンの概念に進化しています。これは春に理解され、依存関係を注入します。実際的に重要なアプリケーションでは、特定のビジネスロジックを完了するために互いに協力するための複数のクラスが必要です。従来の慣行は、各オブジェクトがそれ自体に関連するオブジェクトへの参照を管理する責任があることです(この関連するオブジェクトは、春に表現されたオブジェクトに依存するオブジェクトです)が、これにより、高度に結合されたコードとコードをテストすることが困難になります。
次のコードを検討してください
/**この口の困難なクラス名は、シミュレートされたシーンに合うように著者によって特別に命名されました*このクラスは、2016/8/25にWungによって作成された少女*を救出した騎士を表しています。 */Public Class DamselRescuingKnightはKnight {Private Rescuedamselquest Quest;/*** Condustructor*を作成し、Constructorを作成し、Constructorを結合します。 EmbarkonQuest(){Quest.Embark();}}カップリングには2つの側面があります。一方では、しっかりと結合したコードをテスト、再利用、理解することは困難であり、「ゴブリンとの戦い」タイプのバグがあります。一方、ある程度の結合が必要であり、異なるクラスが適切な方法で対話する必要があります。
問題が発生しているので、Springはどのようにそれを解決しましたか?
春には、依存関係注入(DI)を通じて、オブジェクト間の依存関係は、オブジェクトを作成するときに各オブジェクトを調整するシステム内のサードパーティコンポーネントによって設定されます。言い換えれば、オブジェクトは依存関係を自分で作成または管理することなく内部プロパティを管理するだけで、依存関係は自動的に必要なオブジェクトに注入されます。
/***この騎士は、2016/8/25年にWungによって作成された少女を救出するために、前の冒険タスクではなく、さまざまなアドベンチャータスクを実行できます。 */Public Class BraveKnightはKnight {Private Quest;/*** BraveKnightはそれ自体でアドベンチャータイプを作成しませんが、建設中にアドベンチャータスクをパラメーターとして合格します*これは、コンストラクターインジェクションの方法の1つです。 Braveknightは、特定のクエスト実装と結びついていません。タスクがクエストインターフェイスを実装する限り、それがどのタイプの冒険であるかは関係ありません。これにより、ゆるいカップリングの目的が達成されます
オブジェクトがインターフェイスを介した依存関係のみを示している場合、この依存関係は、オブジェクト自体が認識されずに異なる具体的な実装に置き換えることができます。
それでは、実用的な意味を注入しましょう
上記のコードについては、勇敢な騎士に特定の実装を備えたアドベンチャータスクを注入します
/** Slaying Dragonsのアドベンチャーミッション(この著者は良い二流です)*2016/8/25にWungによって作成されました。 */public class slaydragonquest explments quest {private printstream stream; public slaydragonquest(printstream stream){this.stream = stream;} public void eberm(){stream.print( "slay the dragon");}}}それで、問題は、SlayDragonQuestで依存するPrintStreamオブジェクトをどのように挿入するか、BraveKnightで依存するクエストオブジェクトを挿入する方法です。前述のスプリングはこれらの依存関係を一元的に管理し、アプリケーションコンポーネント間のコラボレーションを作成する動作は、通常、アセンブリ(配線)、つまり注入と呼ばれます。 Springは、後でさらに詳しく紹介するさまざまなアセンブリ方法を提供します。ここでは、XMLに基づいてアセンブリとJava Annotationsに基づいたアセンブリを簡単に紹介します。
<! - これはアセンブリプロセスです。 slaydragonquestを「Quest」という名前の豆として宣言します。コンストラクターインジェクションであるため、コンストラクター-ARG属性値を使用して注入値を表します。このプロセスは、以前の問題を解決します。 PrintStreamオブジェクトをSlayDragonQuestオブジェクトに注入 - > <Bean ID = "Quest"> <constructor-arg value = "#{t(system).out}"> </constructor-arg> </bean> <! - このプロセスは上記と同じです。 Braveknightは、「ナイト」という名前の豆(この名前は必ずしも使用されていない)を宣言し、BraveKnightのコンストラクターパラメーターはクエストタイプである必要があります。この時点で、別の豆が参照に渡されます。これは、上記の「クエスト」という名前の豆の参照です。この時点で、BraveKnightのコンストラクターインジェクションも完了します - > <Bean id = "Knight"> <constructor-arg ref = "Quest"> </constructor-arg> </bean>Springは、XMLの代替として使用できるJavaベースの構成を提供します
/** Javaベースの構成ファイルは、2016/8/26にWungによって作成されたオブジェクトのアセンブリを実装します。 */ @configurationpublic class Knightconfig {@bean public Knight(){return new braveknight(quest()); } @Bean Public Quest Quest(){return new SlayDragonQuest(System.out); }}効果は同じであり、特定の説明については、次の章で詳しく説明します。もう一度確認しましょう。 Springはオブジェクト間の依存関係を自動的に管理すると言われているので、この種のマネージャーは何ですか?答えはアプリケーションのコンテキストです。これは、豆の定義をロードして組み立てることができるスプリングの容器です。スプリングアプリケーションコンテキストは、オブジェクトの作成とアセンブリに対して単独で責任を負います。実際、このコンテキストの違いを実装するには多くの方法があります。これは、読み込み構成の違いだけです。構成をロードする方法を見てみましょう。
public class Knightmain {public static void main(string [] args){annotationConfigApplicationContext = new AnnotationConfigApplicationContext(KnightConfig.class); // Beanの定義は、構成ファイルから取得できます。 Knight Knight = Context.getBean(Knight.Class); knight.embarkonquest(); context.close(); }}顔の切断を適用します
DIは共同ソフトウェアコンポーネントをゆるく結合しておくことができますが、ファセットプログラミングを使用すると、アプリケーション全体で関数を分離して再利用可能なコンポーネントを形成できます。より具体的には、ソフトウェアシステムを努力させるためのテクノロジーです。焦点は何ですか?ロギング、トランザクション管理、セキュリティ管理などのシステムサービスは、多くの場合、ビジネスロジック自体を持つ他のコンポーネントに統合する必要があります。これらのシステムサービスは、通常、システムの複数のコンポーネントにまたがる複数の場所で再利用されるため、クロスカットフォーカスと呼ばれます。簡単に言えば、他のさまざまなコンポーネントから再利用する必要があるサービスを抽出しますが、それらを使用する方法は?実際、使用するときに使用する必要がある場所にメソッドを挿入することです。ただし、この用語「セクション」によれば、再使用されたコンポーネントをセクションとして抽出し、必要に応じてコンポーネントを介してセクションを切断することとして表現する必要があります。したがって、このようにして、コアアプリケーションはこれらのセクションの存在を知る必要はなく、セクションではビジネスロジックをコアアプリケーションに統合しません。
/**歌手クラスは、騎士団を賞賛するために使用されます。つまり、2016/8/26年にWungによって作成された騎士団*に仕えるために使用されます。 */public class minstrel {pript Stream Stream; Public Minstrel(printStream Stream){this.stream = stream; } // public void singbeforequest(){stream.print( "begin"); } // public void singafterquest(){stream.print( "end"); }}パブリッククラスのブレイブナイトはナイト{プライベートクエスト;プライベートミンストレルミンストレル;/***ブレイブナイトは独自にアドベンチャータイプを作成しませんが、冒険タスクを構築のパラメーターとして渡します*これは、コンストラクターインジェクションの1つです* ///パブリックブレイブナイト(クエストクエスト){// minstrel){this.quest = quest; this.minstrel = minstrel;} public void ebarkonquest(){minstrel.singbeforequest(); quest.embark(); minstrel.singafterquest();}}}この時点で、勇敢な騎士は処刑を始めましたが、彼は彼の職務ではそれが単なるリスクではないことを発見しましたが、今では彼は彼を称賛するために歌手を管理しなければなりませんでしたが、これ自体は管理されるべきカテゴリに属してはなりません。したがって、セクションのアイデアを使用して、歌手の賞賛の行動を抽出し、セクションになる必要があります。 Cavaliersがリスクを冒す前に、このセクションはSingBeForeQuestメソッドを切り取り、実行し、リスクの後にSingafterQuestメソッドを実行します。したがって、これは騎士によって賞賛される必要のないコードを実現し、歌手は騎士の目的には存在しません。彼は騎士を称賛するだけでなく、他の人がこのセクションを使用して入る限り、誰もが称賛します。
<エントリポイントカットの前後のポストノート実行 - > </aop:後> </aop:before> </aop:pointcut> </aop:</aop:config>
状況は、ミンストレルはまだ独立したポジーであり、スプリングの文脈がそれをセクションに変えたということです。最も重要なことは、騎士が現時点でこのセクションの存在について知らないことです。これはただの小さな栗であり、実際に多くの重要なことをすることができます。
テンプレートを使用して、スタイルコードを削除します
JDBCを使用してデータベースにアクセスしてデータを照会する場合、完全なプロセスでは、接続の確立、ステートメントオブジェクトの作成、結果セットの処理、クエリ、さまざまな接続の閉鎖が必要です。さらに、さまざまな例外がキャプチャされ、その後、さまざまなシナリオのクエリにはそのような骨の折れる繰り返しが必要です。 JDBCは、このようなスタイルコードがたくさんある唯一のケースだけではありません。 Springは、SpringのJDBCtemplateなどのテンプレートカプセル化を介してスタイルコードを削除することを目的としています。
あなたの豆を収容します
Springベースのアプリケーションでは、アプリケーションオブジェクトはオブジェクトを組み立て、ライフサイクルを管理するオブジェクトを作成する責任があるスプリングコンテナに住んでいます。では、スプリングコンテナとは何ですか?容器には1つだけではありません。 Springには複数のコンテナの実装が付属しています。これは、基本的なDIサポートを提供する最も単純なコンテナであるBean Factoriesの2つのカテゴリに分かれています。アプリケーションのコンテキストは比較的高度であり、アプリケーションフレームレベルのサービスを提供します。ほとんどの場合、アプリケーションのコンテキストがより一般的です。
アプリケーションコンテキストは、構成をロードするさまざまな方法に分割されます。
さまざまなスプリング機能
要約します
Springは、開発を簡素化できるフレームワークテクノロジーであり、そのコアコンテンツはDIとAOPです。
上記はこの記事に関するゴシップです - 春のコンテンツ全体を徐々に理解しているので、誰にとっても役立つことを願っています。興味のある友達は引き続きこのサイトを参照できます:
springmvcの開始例
構成ファイルを使用して属性値を注入するためのコードの詳細な説明と春の@value
Spring Integrated Redis詳細コードサンプル
欠点がある場合は、それを指摘するためにメッセージを残してください。