著者:ガイドコロンビアの
リンクします。https://www.zhihu.com/question/48427693/answer/692943779
出典:ほとんど知っている
著者が著作権を保有。営利目的の複製については、作者に連絡して承認を得てください。非営利目的の複製については、出典を明記してください。
一般に、Springフレームワークは、多くのモジュールのコレクションであるSpring Frameworkを指します。これらのモジュールは、以下に示すように、コアコンテナー、データアクセス/統合、Web、AOP(アスペクト指向プログラミング)、ツール、メッセージングおよびテストモジュールです。示されているように。Springのフレームワークの主な目的は、Javaバックエンド開発を簡素化することです。
重要なSpringモジュールをいくつか挙げてください。
重要なSpring Frameworkモジュールは次のとおりです。
- Spring Core:基本、他のすべてのSpring関数はこのライブラリに依存する必要があると言えます。主にIOC依存性注入機能を提供します。
- ** Spring Aspects **:このモジュールは、AspectJとの統合をサポートします。
- Spring AOP:アスペクト指向プログラミングの実装を提供します。
- Spring JDBC:Javaデータベース接続。
- Spring JMS:Java Message Service。
- Spring ORM:HibernateなどのORMツールをサポートするために使用されます。
- Spring Web:Webアプリケーションの作成をサポートします。
- Spring Test:JUnitおよびTestNGテストのサポートを提供します。
Spring IoCとAOPの理解について話す
IoC
IoC(制御の逆:制御の反転)が、デザインのアイデアがあり、もともと管理するために、Springフレームワークに引き渡さプログラム手動制御、内のオブジェクトを作成します。IoCは他の言語でも使用されており、Spirngに固有のものではありません。IoCコンテナーは、SpringがIoCを実装するために使用するキャリアです。IoCコンテナーは実際にはマップ(キー、値)であり、さまざまなオブジェクトがマップに格納されます。
オブジェクト間の相互依存性は、管理のためにIOCコンテナーに渡され、IOCコンテナーはオブジェクトの注入を完了します。これにより、アプリケーションの開発が大幅に簡略化され、複雑な依存関係からアプリケーションを解放できます。IOCコンテナーはファクトリーのようなもので、オブジェクトを作成する必要がある場合、オブジェクトの作成方法に関係なく、構成ファイル/アノテーションを構成するだけで済みます。実際のプロジェクトでは、Serviceクラスの最下層として数百または数千ものクラスが存在する可能性があります。このServiceをインスタンス化する必要がある場合は、このServiceのすべての最下位クラスのコンストラクターを毎回把握する必要があります。人を夢中にさせる。IOCを使用する場合は、構成して、必要な場所を参照するだけでよいので、プロジェクトの保守性が大幅に向上し、開発の困難さが軽減されます。
Spring時代は、XMLファイルでBeanを構成するのが一般的でしたが、開発者はXMLファイルの構成があまり良くないと感じ、SpringBootアノテーションの構成が徐々に普及しました。
推奨される読書:HTTPS :. // WWW zhihu.com/question/2327 7575 /応答/ 169 698 662
Spring IOC初期化プロセス:
IOCソースコードの読み取り
AOP
AOP(アスペクト指向プログラミング:アスペクト指向プログラミング)は、ビジネスには関係ないが、ビジネスモジュールによって一般的に呼び出されるロジックまたは責任(トランザクション処理、ログ管理、権限制御など)をカプセル化できます。これは、システムの繰り返しコードを減らすのに便利です。、モジュール間の結合を低減するため、および将来の拡張性と保守性を助長しています。
Spring AOPは動的プロキシに基づいています。プロキシされるオブジェクトがインターフェースを実装している場合、Spring AOPはJDKプロキシを使用してプロキシオブジェクトを作成します。インターフェースを実装していないオブジェクトの場合、JDKプロキシを使用してプロキシすることはできません。現時点では、Spring AOPはCglibを使用します。このとき、Spring AOPは次の図に示すように、Cglibを使用してプロキシオブジェクトのサブクラスをプロキシとして生成します。
もちろん、AspectJを使用することもできます。SpringAOPにはAspectJが統合されています。AspectJは、Javaエコシステムで最も完全なAOPフレームワークと見なす必要があります。
AOPを使用した後、いくつかの一般的な関数を抽象化し、必要に応じてそれらを直接使用できるため、コードの量が大幅に簡略化されます。また、新しい機能を追加する必要がある場合にも便利です。これにより、システムのスケーラビリティも向上します。AOPは、ロギング、トランザクション管理などのシナリオで使用されます。
Spring AOPとAspectJ AOPの違いは何ですか?
Spring AOPはランタイム拡張であり、AspectJはコンパイル時拡張です。Spring AOPはプロキシに基づいており、AspectJはバイトコード操作に基づいています。
Spring AOPにはAspectJが統合されています。AspectJは、Javaエコシステムで最も完全なAOPフレームワークと見なす必要があります。AspectJはSpring AOPよりも強力ですが、Spring AOPは比較的単純です。
断面が少ない場合、2つの間のパフォーマンスの違いは重要ではありません。ただし、アスペクトが多すぎる場合は、Spring AOPよりもはるかに高速なAspectJを選択することをお勧めします。
春の豆の範囲は何ですか?
- シングルトン:唯一のBeanインスタンス。SpringのBeanは、デフォルトではシングルトンです。
- プロトタイプ:リクエストごとに新しいBeanインスタンスが作成されます。
- リクエスト:各HTTPリクエストは、現在のHTTPリクエスト内でのみ有効な新しいBeanを生成します。
- セッション:各HTTPリクエストは、現在のHTTPセッションでのみ有効な新しいBeanを生成します。
- グローバルセッション:グローバルセッションスコープは、ポートレットベースのWebアプリケーションでのみ意味があり、Spring 5はなくなりました。ポートレットは、セマンティックコード(HTMLなど)フラグメントを生成できる小さなJava Webプラグインです。これらはポートレットコンテナーに基づいており、サーブレットのようなHTTPリクエストを処理できます。ただし、サーブレットとは異なり、各ポートレットには異なるセッションがあります
春のBeanライフサイクル?
Spring MVCの利点は何ですか?
SpringMVCは機能しますか?
原理を以下に示します。
上図の小さなタイプミス:リクエストを受信して結果に応答するために、フロントエンドコントローラーDispatcherServletであるSpring MVCのエントリ関数が使用されます。
プロセスの説明(重要):
- クライアント(ブラウザー)は要求を送信し、それをDispatcherServletに直接要求します。
- DispatcherServletはリクエスト情報に従ってHandlerMappingを呼び出し、リクエストに対応するHandlerを解析します。
- 対応するハンドラー(つまり、通常言うコントローラー)への解析後、それはHandlerAdapterアダプターによって処理されます。
- HandlerAdapterは実際のプロセッサーを呼び出して、ハンドラーに従って要求を処理し、対応するビジネスロジックを処理します。
- プロセッサはビジネスを処理した後、ModelAndViewオブジェクトを返します。Modelは返されたデータオブジェクトで、Viewは論理ビューです。
- ViewResolverは、論理ビューに基づいて実際のビューを検索します。
- DispaterServletは返されたモデルをビューに渡します(ビューレンダリング)。
- ビューをリクエスタ(ブラウザ)に返す
Springフレームワークで使用されている設計パターンは何ですか?
より一般的なもの:
- ファクトリー・デザイン・パターン:Springはファクトリー・パターンを使用して、Beanオブジェクトを渡し
BeanFactory
、ApplicationContext
作成します。 - エージェント設計パターン:Spring AOP機能の実現。
- シングルトン設計パターン:SpringのBeanは、デフォルトではシングルトンです。
- テンプレートメソッドパターン:Spring、
jdbcTemplate
およびhibernateTemplate
データベースでのテンプレート操作で終わるその他のクラスは、テンプレートパターンを使用します。 - ラッパーの設計パターン:私たちのプロジェクトは複数のデータベースに接続する必要があり、訪問ごとに異なる顧客が必要に応じて異なるデータベースにアクセスします。このモデルにより、顧客のニーズに基づいて異なるデータソース間を動的に切り替えることができます。
- オブザーバーパターン: Springイベント駆動型モデルは、オブザーバーパターンの古典的なアプリケーションです。
- アダプターパターン:Spring AOPの拡張機能または通知(アドバイス)はアダプターパターンを使用し、Spring MVCもアダプターパターン適応を使用し
Controller
ます。
Springはトランザクションをいくつの方法で管理しますか?
- コードにハードコードされたプログラムによるトランザクション。(非推奨)
- 構成ファイルで構成された宣言型トランザクション(推奨)
宣言型トランザクションには次の2つのタイプがあります。
- XMLベースの宣言型トランザクション
- 注釈ベースの宣言型トランザクション
Springトランザクションの分離レベルは何ですか?
分離レベルを表す5つの定数がTransactionDefinitionインターフェースで定義されています。
- TransactionDefinition.ISOLATION_DEFAULT:バックエンドデータベースのデフォルトの分離レベル、MysqlのデフォルトのREPEATABLE_READ分離レベル、OracleのデフォルトのREAD_COMMITTED分離レベルを使用します。
- TransactionDefinition.ISOLATION_READ_UNCOMMITTED:最も低い分離レベル。コミットされていないデータ変更の読み取りを許可します。これにより、ダーティリード、ファントムリード、または繰り返し不可の読み取りが発生する可能性があります。
- TransactionDefinition.ISOLATION_READ_COMMITTED:並行トランザクションによって送信されたデータの読み取りを許可し、ダーティリードを防ぐことができますが、マジックリードまたは繰り返し不可の読み取りが発生する可能性があります
- TransactionDefinition.ISOLATION_REPEATABLE_READ:独自のトランザクションによってデータが変更されない限り、同じフィールドでの複数の読み取りの結果は一貫しており、ダーティリードや繰り返し不可の読み取りを防ぐことができますが、マジックリードは引き続き発生します。
- TransactionDefinition.ISOLATION_SERIALIZABLE: ACID分離レベルに完全に準拠した最高の分離レベル。すべてのトランザクションは1つずつ順番に実行されるため、トランザクション間の干渉の可能性はありません。つまり、このレベルでは、ダーティリード、繰り返し不可の読み取り、マジックリードを防ぐことができます。しかし、これはプログラムのパフォーマンスに深刻な影響を及ぼします。通常、このレベルは使用されません。
Springトランザクションでのトランザクション伝播動作の種類は何ですか?
現在のトランザクションをサポートします。
- TransactionDefinition.PROPAGATION_REQUIRED:現在トランザクションがある場合はトランザクションに参加し、トランザクションがない場合は新しいトランザクションを作成します。
- TransactionDefinition.PROPAGATION_SUPPORTS:現在トランザクションがある場合はトランザクションに参加し、現在トランザクションがない場合は非トランザクション的な方法で実行を続けます。
- TransactionDefinition.PROPAGATION_MANDATORY:現在トランザクションがある場合はトランザクションに参加し、現在トランザクションがない場合は例外をスローします。(必須:必須)
現在のトランザクションをサポートしないケース:
- TransactionDefinition.PROPAGATION_REQUIRES_NEW:新しいトランザクションを作成し、現在トランザクションがある場合は、現在のトランザクションを一時停止します。
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED:非トランザクションモードで実行し、現在トランザクションがある場合は、現在のトランザクションを一時停止します。
- TransactionDefinition.PROPAGATION_NEVER:非トランザクションモードで実行します。トランザクションが現在存在する場合は、例外がスローされます。
その他の状況:
- TransactionDefinition.PROPAGATION_NESTED:現在トランザクションがある場合は、現在のトランザクションのネストされたトランザクションとして実行するトランザクションを作成します。現在トランザクションがない場合、値はTransactionDefinition.PROPAGATION_REQUIREDと同等です。